Structure PUT by using omit.Value

This commit is contained in:
Eli Ribble 2026-04-02 13:28:18 +00:00
parent 353a3ea442
commit 3745231f51
No known key found for this signature in database
2 changed files with 30 additions and 27 deletions

View file

@ -9,23 +9,24 @@ import (
"github.com/Gleipnir-Technology/nidus-sync/db/models" "github.com/Gleipnir-Technology/nidus-sync/db/models"
nhttp "github.com/Gleipnir-Technology/nidus-sync/http" nhttp "github.com/Gleipnir-Technology/nidus-sync/http"
"github.com/Gleipnir-Technology/nidus-sync/platform" "github.com/Gleipnir-Technology/nidus-sync/platform"
"github.com/aarondl/opt/omit"
"github.com/aarondl/opt/omitnull" "github.com/aarondl/opt/omitnull"
"github.com/gorilla/mux" "github.com/gorilla/mux"
"github.com/rs/zerolog/log" "github.com/rs/zerolog/log"
) )
type user struct { type user struct {
Avatar *string `json:"avatar"` Avatar omitnull.Val[string] `json:"avatar"`
DisplayName string `json:"display_name"` DisplayName omit.Val[string] `json:"display_name"`
ID int `json:"id"` ID omit.Val[int] `json:"id"`
Initials string `json:"initials"` Initials omit.Val[string] `json:"initials"`
IsActive bool `json:"is_active"` IsActive omit.Val[bool] `json:"is_active"`
PasswordHash string `json:"-"` PasswordHash omit.Val[string] `json:"-"`
PasswordHashType string `json:"-"` PasswordHashType omit.Val[string] `json:"-"`
Role string `json:"role"` Role omit.Val[string] `json:"role"`
Tags []string `json:"tags"` Tags omit.Val[[]string] `json:"tags"`
URI string `json:"uri"` URI omit.Val[string] `json:"uri"`
Username string `json:"username"` Username omit.Val[string] `json:"username"`
} }
func User(r *router) *userR { func User(r *router) *userR {
@ -46,15 +47,15 @@ func (res *userR) response(u *platform.User) (*user, error) {
return nil, fmt.Errorf("id to uri: %w", err) return nil, fmt.Errorf("id to uri: %w", err)
} }
return &user{ return &user{
Avatar: avatar, Avatar: omitnull.FromPtr(avatar),
DisplayName: u.DisplayName, DisplayName: omit.From(u.DisplayName),
ID: int(u.ID), ID: omit.From(int(u.ID)),
Initials: u.Initials, Initials: omit.From(u.Initials),
IsActive: u.Active, IsActive: omit.From(u.Active),
Role: u.Role, Role: omit.From(u.Role),
Tags: u.Tags, Tags: omit.From(u.Tags),
URI: uri, URI: omit.From(uri),
Username: u.Username, Username: omit.From(u.Username),
}, nil }, nil
} }
@ -81,16 +82,19 @@ func (res *userR) ByIDPut(ctx context.Context, r *http.Request, user platform.Us
user_id_str := vars["id"] user_id_str := vars["id"]
user_id, err := strconv.Atoi(user_id_str) user_id, err := strconv.Atoi(user_id_str)
if err != nil { if err != nil {
return "", nhttp.NewErrorStatus(http.StatusBadRequest, "user update: %w", err) return "", nhttp.NewErrorStatus(http.StatusBadRequest, "user id conversion: %w", err)
} }
user_changes := &models.UserSetter{} user_changes := &models.UserSetter{}
if updates.Avatar != nil { if updates.Avatar.IsValue() {
avatar_uuid, err := res.router.UUIDFromURI("avatar.ByUUIDGet", *updates.Avatar) avatar_uuid, err := res.router.UUIDFromURI("avatar.ByUUIDGet", updates.Avatar.MustGet())
if err != nil { if err != nil {
return "", nhttp.NewBadRequest("parse avatar uri: %w", err) return "", nhttp.NewBadRequest("parse avatar uri: %w", err)
} }
user_changes.Avatar = omitnull.FromPtr(avatar_uuid) user_changes.Avatar = omitnull.FromPtr(avatar_uuid)
} }
if updates.DisplayName.IsValue() {
user_changes.DisplayName = updates.DisplayName
}
err = platform.UserUpdate(ctx, user, user_id, user_changes) err = platform.UserUpdate(ctx, user, user_id, user_changes)
if err != nil { if err != nil {
return "", nhttp.NewError("user update: %w", err) return "", nhttp.NewError("user update: %w", err)

View file

@ -331,13 +331,12 @@ const removeTag = (tag: string) => {
}; };
interface UserRequestPut { interface UserRequestPut {
avatar: string | null; avatar?: string | null;
display_name?: string;
} }
const saveChanges = async () => { const saveChanges = async () => {
console.log("Saving user changes"); console.log("Saving user changes");
let payload: UserRequestPut = { let payload: UserRequestPut = {};
avatar: "",
};
if (selectedFile.value) { if (selectedFile.value) {
try { try {
const formData = new FormData(); const formData = new FormData();