package api import ( "encoding/json" "fmt" "form/database" "form/model" "net/http" "github.com/google/uuid" ) func GetAllUsers(w http.ResponseWriter, req *http.Request) { w.Header().Set("Content-Type", "application/json") var request model.GetAllUsersRequest decoder := json.NewDecoder(req.Body) decoder.Decode(&request) claims, e := VerifyJWT(request.Token, defaultsecretkey) if e != nil || claims["is_superuser"] != true { fmt.Fprintf(w, "{\"status\":403}") return } users, e := database.GetAllUsers() if e != nil { fmt.Fprintf(w, "{\"error\":\"%v\"}", e) return } var responseUsers []model.UserResponse for i := range users { responseUsers = append(responseUsers, model.UserResponse{ Id: users[i].Id, Username: users[i].Username, Email: users[i].Email, Group: users[i].Group, IsSuperuser: users[i].IsSuperuser, }) } jsondata, _ := json.Marshal(responseUsers) fmt.Fprint(w, string(jsondata)) } func GetUser(w http.ResponseWriter, req *http.Request) { w.Header().Set("Content-Type", "application/json") var request model.Token decoder := json.NewDecoder(req.Body) decoder.Decode(&request) claims, e := VerifyJWT(request.Token, defaultsecretkey) if e != nil { fmt.Fprintf(w, "{\"status\":403}") return } user, e := database.GetUserByUsername(fmt.Sprintf("%v", claims["username"])) if e != nil { fmt.Fprintf(w, "{\"error\":\"%v\"}", e) return } responseUser := model.UserResponse{ Id: user.Id, Username: user.Username, Email: user.Email, Group: user.Group, IsSuperuser: user.IsSuperuser, } jsondata, _ := json.Marshal(responseUser) fmt.Fprint(w, string(jsondata)) } func ChangePassword(w http.ResponseWriter, req *http.Request) { w.Header().Set("Content-Type", "application/json") var request model.ChangePasswordRequest decoder := json.NewDecoder(req.Body) decoder.Decode(&request) claims, e := VerifyJWT(request.Token, defaultsecretkey) if e != nil { fmt.Fprintf(w, "{\"status\": 403}") return } user, e := database.GetUserByUsername(fmt.Sprintf("%v", claims["username"])) if e != nil { fmt.Fprintf(w, "{\"error\":\"%v\"}", e) return } if user.Password == request.OldPassword { database.Db.Model(&user).Update("Password", request.NewPassword) fmt.Fprint(w, "{\"status\":200}") return } fmt.Fprintf(w, "{\"status\":403}") } func DelUser(w http.ResponseWriter, req *http.Request) { w.Header().Set("Content-Type", "application/json") var request model.DelUserRequest decoder := json.NewDecoder(req.Body) decoder.Decode(&request) claims, e := VerifyJWT(request.Token, defaultsecretkey) if e != nil { fmt.Fprintf(w, "{\"status\": 403}") return } if claims["is_superuser"] == true || request.UserId != "" { user, e := database.GetUserById(request.UserId) if e != nil { fmt.Fprintf(w, "{\"error\":\"%v\"}", e) return } e = database.DeleteUser(user.Id) if e != nil { fmt.Fprintf(w, "{\"error\":\"%v\"}", e) return } fmt.Fprintf(w, "{\"status\":200}") return } e = database.DeleteUser(fmt.Sprintf("%v", claims["id"])) if e != nil { fmt.Fprintf(w, "{\"error\":\"%v\"}", e) return } fmt.Fprint(w, "{\"status\":200}") } func AddUser(w http.ResponseWriter, req *http.Request) { w.Header().Set("Content-Type", "application/json") var request model.AddUserRequest decoder := json.NewDecoder(req.Body) decoder.Decode(&request) claims, e := VerifyJWT(request.Token, defaultsecretkey) if e != nil { fmt.Fprintf(w, "{\"status\": 403}") return } if claims["is_superuser"] == true { id, err := uuid.NewRandom() if err != nil { fmt.Fprintf(w, "{\"error\":\"%v\"}", err) return } _, e := database.GetUserByUsername(request.Username) if e != nil { e = database.CreateUser(&model.User{ Id: id.String(), Username: request.Username, Email: request.Email, Password: request.Password, Group: request.Group, IsSuperuser: request.IsSuperuser, }) if e != nil { fmt.Fprintf(w, "{\"error\":\"%v\"}", e) return } fmt.Fprintf(w, "{\"status\": 200}") return } fmt.Fprintf(w, "{\"error\":\"username already exists\"}") return } fmt.Fprintf(w, "{\"status\":403}") } func RegisterUser(w http.ResponseWriter, req *http.Request) { w.Header().Set("Content-Type", "application/json") var request model.AddUserRequest decoder := json.NewDecoder(req.Body) decoder.Decode(&request) if request.Username == "" { fmt.Fprintf(w, "{\"error\":\"need more data\"}") return } id, err := uuid.NewRandom() if err != nil { fmt.Fprintf(w, "{\"error\":\"%v\"}", err) return } group := "users" if request.Group != "" { group = request.Group } _, e := database.GetUserByUsername(request.Username) if e != nil { e = database.CreateUser(&model.User{ Id: id.String(), Username: request.Username, Email: request.Email, Password: request.Password, Group: group, IsSuperuser: request.IsSuperuser, }) if e != nil { fmt.Fprintf(w, "{\"error\":\"%v\"}", e) return } fmt.Fprintf(w, "{\"status\": 200}") return } fmt.Fprintf(w, "{\"error\":\"username already exists\"}") } func ChangeUser(w http.ResponseWriter, req *http.Request) { w.Header().Set("Content-Type", "application/json") var request model.ChangeUserRequest decoder := json.NewDecoder(req.Body) decoder.Decode(&request) claims, e := VerifyJWT(request.Token, defaultsecretkey) if e != nil { fmt.Fprintf(w, "{\"status\": 403}") return } user, e := database.GetUserByUsername(fmt.Sprintf("%v", claims["username"])) if e != nil { fmt.Fprintf(w, "{\"error\":\"%v\"}", e) return } database.Db.Model(&user).Updates(map[string]any{ "Username": request.Username, "Email": request.Email, "Group": request.Group, "IsSuperuser": request.IsSuperuser, }) fmt.Fprint(w, "{\"status\":200}") }