package routing import ( "encoding/xml" lishwist "lishwist/core" "lishwist/http/response" "net/http" "github.com/Teajey/rsvp" ) type UserList struct { XMLName xml.Name `xml:"Users" json:"-"` Users []lishwist.User `xml:"User"` } func Users(app *lishwist.Session, session *response.Session, h http.Header, r *http.Request) rsvp.Response { admin := app.Admin() if admin == nil { return response.NotFound() } users, err := admin.ListUsers() if err != nil { return response.Error(http.StatusInternalServerError, "Failed to get users: %s", err) } return response.Data("", UserList{Users: users}) } func User(app *lishwist.Session, session *response.Session, h http.Header, r *http.Request) rsvp.Response { admin := app.Admin() if admin == nil { return response.NotFound() } reference := r.PathValue("userReference") user, err := lishwist.GetUserByReference(reference) if err != nil { return response.Error(http.StatusInternalServerError, "Failed to get user: %s", err) } if user == nil { return response.Error(http.StatusNotFound, "User not found") } return response.Data("", user) } func UserPost(app *lishwist.Session, session *response.Session, h http.Header, r *http.Request) rsvp.Response { admin := app.Admin() if admin == nil { return response.NotFound() } err := r.ParseForm() if err != nil { return response.Error(http.StatusBadRequest, "Failed to parse form") } reference := r.PathValue("userReference") intent := r.Form.Get("intent") if intent != "" { switch intent { case "delete": if reference == app.User().Reference { return response.Error(http.StatusForbidden, "You cannot delete yourself.") } err = admin.UserSetLive(reference, false) if err != nil { return response.Error(http.StatusInternalServerError, "Failed to delete user: %s", err) } case "rename": name := r.Form.Get("display_name") err = admin.RenameUser(reference, name) if err != nil { return response.Error(http.StatusInternalServerError, "Failed to rename user: %s", err) } case "set_password": newPassword := r.Form.Get("new_password") err = admin.SetUserPassword(reference, newPassword) if err != nil { return response.Error(http.StatusInternalServerError, "Failed to set new password: %s", err) } default: return response.Error(http.StatusBadRequest, "Invalid intent %q", intent) } } user, err := lishwist.GetUserByReference(reference) if err != nil { return response.Error(http.StatusInternalServerError, "Failed to get user: %s", err) } return response.Data("", user) }