77 "github.com/rs/zerolog"
88 res "github.com/swamphacks/core/apps/api/internal/api/response"
99 "github.com/swamphacks/core/apps/api/internal/ctxutils"
10- "github.com/swamphacks/core/apps/api/internal/db/sqlc"
1110 "github.com/swamphacks/core/apps/api/internal/email"
1211 "github.com/swamphacks/core/apps/api/internal/services"
1312)
@@ -24,7 +23,6 @@ func NewUserHandler(userService *services.UserService, logger zerolog.Logger) *U
2423 }
2524}
2625
27- // GetProfile returns the current user's profile information
2826func (h * UserHandler ) GetProfile (w http.ResponseWriter , r * http.Request ) {
2927 userId := ctxutils .GetUserIdFromCtx (r .Context ())
3028 if userId == nil {
@@ -46,120 +44,46 @@ func (h *UserHandler) GetProfile(w http.ResponseWriter, r *http.Request) {
4644 res .Send (w , http .StatusOK , user )
4745}
4846
49- // UpdateProfileRequest represents the request body for updating user profile
50- type UpdateProfileRequest struct {
51- Name * string `json:"name,omitempty"`
52- Email * string `json:"email,omitempty"`
47+ type CompleteOnboardingRequest struct {
48+ Name string `json:"name"`
49+ PreferredEmail string `json:"preferred_email"`
5350}
5451
55- // UpdateProfile updates the current user's profile information
56- func (h * UserHandler ) UpdateProfile (w http.ResponseWriter , r * http.Request ) {
52+ func (h * UserHandler ) CompleteOnboarding (w http.ResponseWriter , r * http.Request ) {
5753 userId := ctxutils .GetUserIdFromCtx (r .Context ())
5854 if userId == nil {
5955 res .SendError (w , http .StatusUnauthorized , res .NewError ("unauthorized" , "User not authenticated" ))
6056 return
6157 }
6258
63- var req UpdateProfileRequest
59+ var req CompleteOnboardingRequest
6460 decoder := json .NewDecoder (r .Body )
6561 decoder .DisallowUnknownFields () // Prevents requests with extraneous fields
6662 if err := decoder .Decode (& req ); err != nil {
6763 res .SendError (w , http .StatusBadRequest , res .NewError ("invalid_request" , "Invalid request body" ))
6864 return
6965 }
7066
71- // Validate that at least one field is provided
72- if req .Name == nil && req .Email == nil {
73- res .SendError (w , http .StatusBadRequest , res .NewError ("invalid_request" , "At least one field (name or email) must be provided " ))
67+ // Validate required fields
68+ if req .Name == "" || req .PreferredEmail == "" {
69+ res .SendError (w , http .StatusBadRequest , res .NewError ("invalid_request" , "Name and preferred email are required " ))
7470 return
7571 }
7672
77- // Validate email format if provided
78- if req .Email != nil && * req .Email != "" {
79- // Basic email validation - you might want to use a more robust validation library
80- if ! email .IsValidEmail (* req .Email ) {
81- res .SendError (w , http .StatusBadRequest , res .NewError ("invalid_email" , "Invalid email format" ))
82- return
83- }
73+ // Validate email format
74+ if ! email .IsValidEmail (req .PreferredEmail ) {
75+ res .SendError (w , http .StatusBadRequest , res .NewError ("invalid_email" , "Invalid email format" ))
76+ return
8477 }
8578
86- err := h .userService .UpdateUserProfile (r .Context (), * userId , req .Name , req .Email )
79+ err := h .userService .CompleteOnboarding (r .Context (), * userId , req .Name , req .PreferredEmail )
8780 if err != nil {
88- h .logger .Err (err ).Msg ("failed to update user profile " )
81+ h .logger .Err (err ).Msg ("failed to complete onboarding " )
8982 if err == services .ErrUserNotFound {
9083 res .SendError (w , http .StatusNotFound , res .NewError ("user_not_found" , "User not found" ))
9184 } else {
92- res .SendError (w , http .StatusInternalServerError , res .NewError ("update_failed" , "Failed to update user profile " ))
85+ res .SendError (w , http .StatusInternalServerError , res .NewError ("update_failed" , "Failed to complete onboarding " ))
9386 }
9487 return
9588 }
96-
97- // Return the updated user profile
98- user , err := h .userService .GetUser (r .Context (), * userId )
99- if err != nil {
100- h .logger .Err (err ).Msg ("failed to get updated user profile" )
101- res .SendError (w , http .StatusInternalServerError , res .NewError ("internal_err" , "Profile updated but failed to retrieve updated data" ))
102- return
103- }
104-
105- res .Send (w , http .StatusOK , user )
106- }
107-
108- type UpdateOnboardedRequest struct {
109- Onboarded bool `json:"onboarded"`
110- }
111-
112- func (h * UserHandler ) UpdateOnboarded (w http.ResponseWriter , r * http.Request ) {
113- userId := ctxutils .GetUserIdFromCtx (r .Context ())
114- if userId == nil {
115- res .SendError (w , http .StatusUnauthorized , res .NewError ("unauthorized" , "User not authenticated" ))
116- return
117- }
118-
119- var req UpdateOnboardedRequest
120- decoder := json .NewDecoder (r .Body )
121- decoder .DisallowUnknownFields () // Prevents requests with extraneous fields
122- if err := decoder .Decode (& req ); err != nil {
123- res .SendError (w , http .StatusBadRequest , res .NewError ("invalid_request" , "Invalid request body" ))
124- return
125- }
126-
127- if req .Onboarded {
128- err := h .userService .UpdateUserOnboarded (r .Context (), * userId )
129- if err != nil {
130- h .logger .Err (err ).Msg ("failed to update user onboarded status" )
131- if err == services .ErrUserNotFound {
132- res .SendError (w , http .StatusNotFound , res .NewError ("user_not_found" , "User not found" ))
133- } else {
134- res .SendError (w , http .StatusInternalServerError , res .NewError ("update_failed" , "Failed to update onboarded status" ))
135- }
136- return
137- }
138- } else {
139- params := sqlc.UpdateUserParams {
140- ID : * userId ,
141- OnboardedDoUpdate : true ,
142- Onboarded : false ,
143- }
144- err := h .userService .UpdateUser (r .Context (), * userId , params )
145- if err != nil {
146- h .logger .Err (err ).Msg ("failed to update user onboarded status" )
147- if err == services .ErrUserNotFound {
148- res .SendError (w , http .StatusNotFound , res .NewError ("user_not_found" , "User not found" ))
149- } else {
150- res .SendError (w , http .StatusInternalServerError , res .NewError ("update_failed" , "Failed to update onboarded status" ))
151- }
152- return
153- }
154- }
155-
156- // Return the updated user profile
157- user , err := h .userService .GetUser (r .Context (), * userId )
158- if err != nil {
159- h .logger .Err (err ).Msg ("failed to get updated user profile" )
160- res .SendError (w , http .StatusInternalServerError , res .NewError ("internal_err" , "Status updated but failed to retrieve updated data" ))
161- return
162- }
163-
164- res .Send (w , http .StatusOK , user )
16589}
0 commit comments