package api import ( "errors" "net/http" "git.fabledsword.com/bvandeusen/minstrel/internal/apierror" "git.fabledsword.com/bvandeusen/minstrel/internal/auth" ) // handleGetMe returns the authenticated user's profile shape — id, // username, display_name, email, is_admin. Mirrors the response shape // of PUT /api/me/profile so the Android Settings → Profile screen // (and Flutter's equivalent) can read its starting state from a GET // before the user has done a first save. // // Drift #578 fix: this previously emitted the narrower UserView // (id, username, is_admin only). Android's MeApi.getProfile() deser- // ialised into MyProfileWire and saw display_name=null, email=null // on every read — wiping the form fields on every Settings open. // Saving from that blank state then submitted empty strings, which // handleUpdateMyProfile treats as "clear to NULL" — DESTROYING the // user's stored display_name + email. Returning the full profile // shape here closes the loop. Web (User type narrower than this // response) keeps working via TypeScript structural typing — the // extra fields are ignored. func (h *handlers) handleGetMe(w http.ResponseWriter, r *http.Request) { user, ok := auth.UserFromContext(r.Context()) if !ok { // Hitting /me without RequireUser in front of it is a routing bug; // it can't happen in real traffic. h.logger.Error("api: /me reached without authenticated user") writeErr(w, apierror.InternalMsg("missing auth context", errors.New("missing auth context"))) return } writeJSON(w, http.StatusOK, profileViewFromUser(user)) }