package handler import ( "encoding/json" "net/http" "github.com/basketikun/infinite-canvas/model" "github.com/basketikun/infinite-canvas/service" ) type loginRequest struct { Username string `json:"username"` Password string `json:"password"` } type registerRequest struct { Username string `json:"username"` Password string `json:"password"` } type saveUserRequest struct { ID string `json:"id"` Username string `json:"username"` Password string `json:"password"` Role model.UserRole `json:"role"` } func Register(w http.ResponseWriter, r *http.Request) { var request registerRequest _ = json.NewDecoder(r.Body).Decode(&request) session, err := service.Register(request.Username, request.Password) if err != nil { FailError(w, err) return } OK(w, session) } func Login(w http.ResponseWriter, r *http.Request) { var request loginRequest _ = json.NewDecoder(r.Body).Decode(&request) session, err := service.Login(request.Username, request.Password) if err != nil { FailError(w, err) return } if session.User.Role != model.UserRoleAdmin { Fail(w, "需要管理员权限") return } OK(w, session) } func AdminLogin(w http.ResponseWriter, r *http.Request) { var request loginRequest _ = json.NewDecoder(r.Body).Decode(&request) session, err := service.Login(request.Username, request.Password) if err != nil { FailError(w, err) return } if session.User.Role != model.UserRoleAdmin { Fail(w, "需要管理员权限") return } OK(w, session) } func CurrentUser(w http.ResponseWriter, r *http.Request) { if user, ok := service.UserFromContext(r.Context()); ok { OK(w, user) return } OK(w, service.GuestUser()) } func AdminUsers(w http.ResponseWriter, r *http.Request) { users, err := service.ListUsers(parseQuery(r)) if err != nil { FailError(w, err) return } OK(w, users) } func AdminSaveUser(w http.ResponseWriter, r *http.Request) { var request saveUserRequest _ = json.NewDecoder(r.Body).Decode(&request) user, err := service.SaveUser(model.User{ ID: request.ID, Username: request.Username, Role: request.Role, }, request.Password) if err != nil { FailError(w, err) return } OK(w, user) } func AdminDeleteUser(w http.ResponseWriter, r *http.Request, id string) { if err := service.DeleteUser(id); err != nil { FailError(w, err) return } OK(w, true) }