mirror of
https://github.com/GlueOps/autoglue.git
synced 2026-02-13 04:40:05 +01:00
121 lines
3.1 KiB
Go
121 lines
3.1 KiB
Go
package handlers
|
|
|
|
import (
|
|
"encoding/json"
|
|
"net/http"
|
|
|
|
"github.com/glueops/autoglue/internal/api/httpmiddleware"
|
|
"github.com/glueops/autoglue/internal/models"
|
|
"github.com/glueops/autoglue/internal/utils"
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
type meResponse struct {
|
|
models.User `json:",inline"`
|
|
Emails []models.UserEmail `json:"emails"`
|
|
Organizations []models.Organization `json:"organizations"`
|
|
}
|
|
|
|
// GetMe godoc
|
|
// @ID GetMe
|
|
// @Summary Get current user profile
|
|
// @Tags Me
|
|
// @Produce json
|
|
// @Success 200 {object} meResponse
|
|
// @Router /me [get]
|
|
// @Security BearerAuth
|
|
// @Security ApiKeyAuth
|
|
func GetMe(db *gorm.DB) http.HandlerFunc {
|
|
return func(w http.ResponseWriter, r *http.Request) {
|
|
u, ok := httpmiddleware.UserFrom(r.Context())
|
|
if !ok {
|
|
utils.WriteError(w, http.StatusUnauthorized, "unauthorized", "not signed in")
|
|
return
|
|
}
|
|
|
|
var user models.User
|
|
if err := db.First(&user, "id = ? AND is_disabled = false", u.ID).Error; err != nil {
|
|
utils.WriteError(w, http.StatusUnauthorized, "unauthorized", "user not found/disabled")
|
|
return
|
|
}
|
|
|
|
var emails []models.UserEmail
|
|
_ = db.Preload("User").Where("user_id = ?", user.ID).Order("is_primary desc, created_at asc").Find(&emails).Error
|
|
|
|
var orgs []models.Organization
|
|
{
|
|
var rows []models.Membership
|
|
_ = db.Where("user_id = ?", user.ID).Find(&rows).Error
|
|
if len(rows) > 0 {
|
|
var ids []interface{}
|
|
for _, m := range rows {
|
|
ids = append(ids, m.OrganizationID)
|
|
}
|
|
_ = db.Find(&orgs, "id IN ?", ids).Error
|
|
}
|
|
}
|
|
|
|
utils.WriteJSON(w, http.StatusOK, meResponse{
|
|
User: user,
|
|
Emails: emails,
|
|
Organizations: orgs,
|
|
})
|
|
}
|
|
}
|
|
|
|
type updateMeRequest struct {
|
|
DisplayName *string `json:"display_name,omitempty"`
|
|
// You can add more editable fields here (timezone, avatar, etc)
|
|
}
|
|
|
|
// UpdateMe godoc
|
|
// @ID UpdateMe
|
|
// @Summary Update current user profile
|
|
// @Tags Me
|
|
// @Accept json
|
|
// @Produce json
|
|
// @Param body body updateMeRequest true "Patch profile"
|
|
// @Success 200 {object} models.User
|
|
// @Router /me [patch]
|
|
// @Security BearerAuth
|
|
// @Security ApiKeyAuth
|
|
func UpdateMe(db *gorm.DB) http.HandlerFunc {
|
|
return func(w http.ResponseWriter, r *http.Request) {
|
|
u, ok := httpmiddleware.UserFrom(r.Context())
|
|
if !ok {
|
|
utils.WriteError(w, http.StatusUnauthorized, "unauthorized", "not signed in")
|
|
return
|
|
}
|
|
|
|
var req updateMeRequest
|
|
if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
|
|
utils.WriteError(w, http.StatusBadRequest, "invalid_json", err.Error())
|
|
}
|
|
|
|
updates := map[string]interface{}{}
|
|
|
|
if req.DisplayName != nil {
|
|
updates["display_name"] = req.DisplayName
|
|
}
|
|
|
|
if len(updates) == 0 {
|
|
var user models.User
|
|
if err := db.First(&user, "id = ?", u.ID).Error; err != nil {
|
|
utils.WriteError(w, 404, "not_found", "user")
|
|
return
|
|
}
|
|
utils.WriteJSON(w, 200, user)
|
|
return
|
|
}
|
|
|
|
if err := db.Model(&models.User{}).Where("id = ?", u.ID).Updates(updates).Error; err != nil {
|
|
utils.WriteError(w, 500, "db_error", err.Error())
|
|
return
|
|
}
|
|
|
|
var out models.User
|
|
_ = db.First(&out, "id = ?", u.ID).Error
|
|
utils.WriteJSON(w, 200, out)
|
|
}
|
|
}
|