11package handlers
22
33import (
4+ "encoding/json"
45 "errors"
56 "net/http"
67
8+ "github.com/go-chi/render"
9+
10+ "github.com/frain-dev/convoy/api/models"
711 "github.com/frain-dev/convoy/auth/realm/jwt"
812 "github.com/frain-dev/convoy/config"
9- "github.com/frain-dev/convoy/datastore"
10-
1113 "github.com/frain-dev/convoy/database/postgres"
12- "github.com/frain-dev/convoy/services"
13-
14- "encoding/json"
15- "github.com/frain-dev/convoy/api/models"
14+ "github.com/frain-dev/convoy/datastore"
1615 "github.com/frain-dev/convoy/internal/pkg/middleware"
16+ "github.com/frain-dev/convoy/services"
1717 "github.com/frain-dev/convoy/util"
18- "github.com/go-chi/render"
1918)
2019
2120type (
@@ -44,7 +43,8 @@ func (h *Handler) InitSSO(w http.ResponseWriter, r *http.Request) {
4443
4544 resp , err := lu .Run ()
4645 if err != nil {
47- _ = render .Render (w , r , util .NewErrorResponse (err .Error (), http .StatusForbidden ))
46+ h .A .Logger .WithError (err ).Errorf ("SSO initialization failed: %v" , err )
47+ _ = render .Render (w , r , util .NewErrorResponse ("Authentication failed" , http .StatusForbidden ))
4848 return
4949 }
5050
@@ -60,7 +60,6 @@ func (h *Handler) RedeemRegisterSSOToken(w http.ResponseWriter, r *http.Request)
6060}
6161
6262func (h * Handler ) redeemSSOToken (w http.ResponseWriter , r * http.Request , intent SSOAuthIntent ) {
63-
6463 configuration := h .A .Cfg
6564
6665 lu := services.LoginUserSSOService {
@@ -75,7 +74,8 @@ func (h *Handler) redeemSSOToken(w http.ResponseWriter, r *http.Request, intent
7574
7675 tokenResp , err := lu .RedeemToken (r .URL .Query ())
7776 if err != nil {
78- _ = render .Render (w , r , util .NewErrorResponse (err .Error (), http .StatusForbidden ))
77+ h .A .Logger .WithError (err ).Errorf ("SSO token redemption failed: %v" , err )
78+ _ = render .Render (w , r , util .NewErrorResponse ("Authentication failed" , http .StatusForbidden ))
7979 return
8080 }
8181
@@ -85,21 +85,26 @@ func (h *Handler) redeemSSOToken(w http.ResponseWriter, r *http.Request, intent
8585 user , token , err = lu .RegisterSSOUser (r .Context (), h .A , tokenResp )
8686 if err != nil {
8787 if errors .Is (err , services .ErrUserAlreadyExist ) {
88- _ = render .Render (w , r , util .NewErrorResponse (err .Error (), http .StatusConflict ))
88+ h .A .Logger .WithError (err ).Errorf ("SSO user registration failed - user already exists: %v" , err )
89+ _ = render .Render (w , r , util .NewErrorResponse ("User already exists" , http .StatusConflict ))
8990 return
9091 }
91- _ = render .Render (w , r , util .NewErrorResponse (err .Error (), http .StatusForbidden ))
92+
93+ h .A .Logger .WithError (err ).Errorf ("SSO user registration failed: %v" , err )
94+ _ = render .Render (w , r , util .NewErrorResponse ("Registration failed" , http .StatusForbidden ))
9295 return
9396 }
9497
9598 } else {
9699 user , token , err = lu .LoginSSOUser (r .Context (), tokenResp )
97100 if err != nil {
98101 if errors .Is (err , datastore .ErrUserNotFound ) {
99- _ = render .Render (w , r , util .NewErrorResponse (err .Error (), http .StatusNotFound ))
102+ h .A .Logger .WithError (err ).Errorf ("SSO login failed - user not found: %v" , err )
103+ _ = render .Render (w , r , util .NewErrorResponse ("Invalid credentials" , http .StatusNotFound ))
100104 return
101105 }
102- _ = render .Render (w , r , util .NewErrorResponse (err .Error (), http .StatusForbidden ))
106+ h .A .Logger .WithError (err ).Errorf ("SSO login failed: %v" , err )
107+ _ = render .Render (w , r , util .NewErrorResponse ("Authentication failed" , http .StatusForbidden ))
103108 return
104109 }
105110 }
@@ -115,13 +120,15 @@ func (h *Handler) redeemSSOToken(w http.ResponseWriter, r *http.Request, intent
115120func (h * Handler ) LoginUser (w http.ResponseWriter , r * http.Request ) {
116121 var newUser models.LoginUser
117122 if err := util .ReadJSON (r , & newUser ); err != nil {
118- _ = render .Render (w , r , util .NewErrorResponse (err .Error (), http .StatusBadRequest ))
123+ h .A .Logger .WithError (err ).Errorf ("Failed to parse login request body: %v" , err )
124+ _ = render .Render (w , r , util .NewErrorResponse ("Invalid request format" , http .StatusBadRequest ))
119125 return
120126 }
121127
122128 configuration , err := config .Get ()
123129 if err != nil {
124- _ = render .Render (w , r , util .NewErrorResponse (err .Error (), http .StatusBadRequest ))
130+ h .A .Logger .Errorf ("Failed to get configuration: %v" , err )
131+ _ = render .Render (w , r , util .NewErrorResponse ("Service temporarily unavailable" , http .StatusInternalServerError ))
125132 return
126133 }
127134
@@ -136,7 +143,21 @@ func (h *Handler) LoginUser(w http.ResponseWriter, r *http.Request) {
136143
137144 user , token , err := lu .Run (r .Context ())
138145 if err != nil {
139- _ = render .Render (w , r , util .NewErrorResponse (err .Error (), http .StatusForbidden ))
146+ h .A .Logger .WithError (err ).Errorf ("User login failed: %v" , err )
147+
148+ var errMsg string
149+
150+ if se , ok := err .(* services.ServiceError ); ok {
151+ switch se .Code {
152+ case services .ErrCodeLicenseExpired :
153+ errMsg = se .ErrMsg
154+ default :
155+ errMsg = "Invalid credentials"
156+ }
157+ }
158+
159+ _ = render .Render (w , r , util .NewErrorResponse (errMsg , http .StatusForbidden ))
160+
140161 return
141162 }
142163
@@ -151,18 +172,21 @@ func (h *Handler) LoginUser(w http.ResponseWriter, r *http.Request) {
151172func (h * Handler ) RefreshToken (w http.ResponseWriter , r * http.Request ) {
152173 var refreshToken models.Token
153174 if err := util .ReadJSON (r , & refreshToken ); err != nil {
154- _ = render .Render (w , r , util .NewErrorResponse (err .Error (), http .StatusBadRequest ))
175+ h .A .Logger .WithError (err ).Errorf ("Failed to parse refresh token request: %v" , err )
176+ _ = render .Render (w , r , util .NewErrorResponse ("Invalid request format" , http .StatusBadRequest ))
155177 return
156178 }
157179
158180 if err := refreshToken .Validate (); err != nil {
159- _ = render .Render (w , r , util .NewErrorResponse (err .Error (), http .StatusBadRequest ))
181+ h .A .Logger .WithError (err ).Errorf ("Refresh token validation failed: %v" , err )
182+ _ = render .Render (w , r , util .NewErrorResponse ("Invalid token" , http .StatusBadRequest ))
160183 return
161184 }
162185
163186 configuration , err := config .Get ()
164187 if err != nil {
165- _ = render .Render (w , r , util .NewErrorResponse (err .Error (), http .StatusBadRequest ))
188+ h .A .Logger .Errorf ("Failed to get configuration: %v" , err )
189+ _ = render .Render (w , r , util .NewErrorResponse ("Service temporarily unavailable" , http .StatusInternalServerError ))
166190 return
167191 }
168192
@@ -174,7 +198,8 @@ func (h *Handler) RefreshToken(w http.ResponseWriter, r *http.Request) {
174198
175199 token , err := rf .Run (r .Context ())
176200 if err != nil {
177- _ = render .Render (w , r , util .NewErrorResponse (err .Error (), http .StatusUnauthorized ))
201+ h .A .Logger .WithError (err ).Errorf ("Token refresh failed: %v" , err )
202+ _ = render .Render (w , r , util .NewErrorResponse ("Invalid or expired token" , http .StatusUnauthorized ))
178203 return
179204 }
180205
@@ -184,13 +209,15 @@ func (h *Handler) RefreshToken(w http.ResponseWriter, r *http.Request) {
184209func (h * Handler ) LogoutUser (w http.ResponseWriter , r * http.Request ) {
185210 auth , err := middleware .GetAuthFromRequest (r )
186211 if err != nil {
187- _ = render .Render (w , r , util .NewErrorResponse (err .Error (), http .StatusUnauthorized ))
212+ h .A .Logger .WithError (err ).Errorf ("Failed to get auth from request: %v" , err )
213+ _ = render .Render (w , r , util .NewErrorResponse ("Authentication required" , http .StatusUnauthorized ))
188214 return
189215 }
190216
191217 configuration , err := config .Get ()
192218 if err != nil {
193- _ = render .Render (w , r , util .NewErrorResponse (err .Error (), http .StatusBadRequest ))
219+ h .A .Logger .Errorf ("Failed to get configuration: %v" , err )
220+ _ = render .Render (w , r , util .NewErrorResponse ("Service temporarily unavailable" , http .StatusInternalServerError ))
194221 return
195222 }
196223
@@ -243,7 +270,8 @@ func (h *Handler) GoogleOAuthToken(w http.ResponseWriter, r *http.Request) {
243270
244271 user , token , err := googleOAuthService .HandleIDToken (r .Context (), request .IDToken , h .A )
245272 if err != nil {
246- _ = render .Render (w , r , util .NewErrorResponse (err .Error (), http .StatusForbidden ))
273+ h .A .Logger .WithError (err ).Errorf ("Google OAuth authentication failed: %v" , err )
274+ _ = render .Render (w , r , util .NewErrorResponse ("Authentication failed" , http .StatusForbidden ))
247275 return
248276 }
249277
@@ -300,7 +328,8 @@ func (h *Handler) GoogleOAuthSetup(w http.ResponseWriter, r *http.Request) {
300328
301329 user , token , err := googleOAuthService .CompleteGoogleOAuthSetup (r .Context (), request .IDToken , request .BusinessName , h .A )
302330 if err != nil {
303- _ = render .Render (w , r , util .NewErrorResponse ("Failed to complete setup: " + err .Error (), http .StatusInternalServerError ))
331+ h .A .Logger .Errorf ("Google OAuth setup failed: %v" , err )
332+ _ = render .Render (w , r , util .NewErrorResponse ("Failed to complete setup" , http .StatusInternalServerError ))
304333 return
305334 }
306335
0 commit comments