diff --git a/pkg/app/auth_routes.go b/pkg/app/auth_routes.go index e02a018..2f97c45 100644 --- a/pkg/app/auth_routes.go +++ b/pkg/app/auth_routes.go @@ -3,6 +3,8 @@ package app import ( "net/http" + "github.com/Damillora/Shioriko/pkg/database" + "github.com/Damillora/Shioriko/pkg/middleware" "github.com/Damillora/Shioriko/pkg/models" "github.com/Damillora/Shioriko/pkg/services" "github.com/gin-gonic/gin" @@ -11,6 +13,11 @@ import ( func InitializeAuthRoutes(g *gin.Engine) { g.POST("/api/auth/login", createToken) + + protected := g.Group("/api/auth").Use(middleware.AuthMiddleware()) + { + protected.POST("/token", createTokenLoggedIn) + } } func createToken(c *gin.Context) { var model models.LoginFormModel @@ -50,3 +57,21 @@ func createToken(c *gin.Context) { }) } } + +func createTokenLoggedIn(c *gin.Context) { + result, ok := c.Get("user") + if ok { + user := result.(*database.User) + if user != nil { + token := services.CreateToken(user) + c.JSON(http.StatusOK, models.TokenResponse{ + Token: token, + }) + } + } else { + c.JSON(http.StatusUnauthorized, models.ErrorResponse{ + Code: http.StatusUnauthorized, + Message: "No authorized user", + }) + } +} diff --git a/pkg/app/user_routes.go b/pkg/app/user_routes.go index 793d727..100c4a4 100644 --- a/pkg/app/user_routes.go +++ b/pkg/app/user_routes.go @@ -18,7 +18,8 @@ func InitializeUserRoutes(g *gin.Engine) { protected := g.Group("/api/user").Use(middleware.AuthMiddleware()) { protected.GET("/profile", userProfile) - protected.POST("/update", userUpdate) + protected.PUT("/update", userUpdate) + protected.PUT("/update-password", userUpdatePassword) } } @@ -114,7 +115,45 @@ func userUpdate(c *gin.Context) { result, ok := c.Get("user") if ok { user := result.(*database.User) - services.UpdateUser(user.ID, model) + services.UpdateUserProfile(user.ID, model) + c.JSON(http.StatusOK, nil) + } else { + c.JSON(http.StatusBadRequest, models.ErrorResponse{ + Code: http.StatusBadRequest, + Message: "User does not exist", + }) + } +} + +func userUpdatePassword(c *gin.Context) { + var model models.UserUpdatePasswordModel + + err := c.ShouldBindJSON(&model) + if err != nil { + c.JSON(http.StatusBadRequest, models.ErrorResponse{ + Code: http.StatusBadRequest, + Message: err.Error(), + }) + c.Abort() + return + } + + validate := validator.New() + err = validate.Struct(model) + if err != nil { + c.JSON(http.StatusBadRequest, models.ErrorResponse{ + Code: http.StatusBadRequest, + Message: err.Error(), + }) + c.Abort() + return + } + + result, ok := c.Get("user") + if ok { + user := result.(*database.User) + services.UpdateUserPassword(user.ID, model) + c.JSON(http.StatusOK, nil) } else { c.JSON(http.StatusBadRequest, models.ErrorResponse{ Code: http.StatusBadRequest, diff --git a/pkg/models/create_update.go b/pkg/models/create_update.go index 62b0eb6..6f2cd17 100644 --- a/pkg/models/create_update.go +++ b/pkg/models/create_update.go @@ -7,8 +7,11 @@ type UserCreateModel struct { } type UserUpdateModel struct { - Email string `json:"email" validate:"required,email"` - Username string `json:"username" validate:"required"` + Email string `json:"email" validate:"required,email"` + Username string `json:"username" validate:"required"` +} + +type UserUpdatePasswordModel struct { OldPassword string `json:"old_password"` NewPassword string `json:"new_password"` } diff --git a/pkg/services/user.go b/pkg/services/user.go index 34b6e29..b0d709f 100644 --- a/pkg/services/user.go +++ b/pkg/services/user.go @@ -39,7 +39,7 @@ func GetUserFromUsername(username string) *database.User { return &user } -func UpdateUser(id string, model models.UserUpdateModel) (*database.User, error) { +func UpdateUserProfile(id string, model models.UserUpdateModel) (*database.User, error) { var user database.User result := database.DB.Where("id = ?", id).First(&user) @@ -49,6 +49,19 @@ func UpdateUser(id string, model models.UserUpdateModel) (*database.User, error) user.Email = model.Email user.Username = model.Username + result = database.DB.Save(&user) + if result.Error != nil { + return nil, result.Error + } + return &user, nil +} + + +func UpdateUserPassword(id string, model models.UserUpdatePasswordModel) (*database.User, error) { + var user database.User + result := database.DB.Where("id = ?", id).First(&user) + + if user.Password != "" { verifyErr := bcrypt.CompareHashAndPassword([]byte(user.Password), []byte(model.OldPassword)) if verifyErr != nil { diff --git a/web/app/src/lib/api.ts b/web/app/src/lib/api.ts index 0c7a7d8..3a1a494 100644 --- a/web/app/src/lib/api.ts +++ b/web/app/src/lib/api.ts @@ -37,6 +37,20 @@ export async function register({ email, username, password }) { return response.data; } + +export async function updateToken() { + const endpoint = url + "/api/auth/token"; + const response = await axios({ + url: endpoint, + method: "POST", + headers: { + 'Authorization': 'Bearer ' + current_token, + }, + }) + token.set(response.data.token); + return response.data; +} + export async function getTags() { const endpoint = url + "/api/tag"; const response = await axios.get(endpoint); @@ -200,8 +214,8 @@ export async function updateTag(id, { name, tagTypeId }) { return response.data; } -export async function updateUserProfile({ email, username, oldPassword, newPassword }) { - const endpoint = url + "/api/tag/" + id; +export async function updateUserProfile({ email, username, }) { + const endpoint = url + "/api/user/update"; const response = await axios({ url: endpoint, method: "PUT", @@ -210,7 +224,22 @@ export async function updateUserProfile({ email, username, oldPassword, newPassw }, withCredentials: true, data: { - email, username, oldPassword, newPassword + email, username, + } + }) + return response.data; +} +export async function updateUserPassword({ old_password, new_password }) { + const endpoint = url + "/api/user/update-password"; + const response = await axios({ + url: endpoint, + method: "PUT", + headers: { + 'Authorization': 'Bearer ' + current_token, + }, + withCredentials: true, + data: { + old_password, new_password } }) return response.data; diff --git a/web/app/src/lib/components/panels/UserActionsPanel.svelte b/web/app/src/lib/components/panels/UserActionsPanel.svelte new file mode 100644 index 0000000..c1d5570 --- /dev/null +++ b/web/app/src/lib/components/panels/UserActionsPanel.svelte @@ -0,0 +1,8 @@ + + +
diff --git a/web/app/src/routes/user/password/+page.svelte b/web/app/src/routes/user/password/+page.svelte new file mode 100644 index 0000000..a5fd462 --- /dev/null +++ b/web/app/src/routes/user/password/+page.svelte @@ -0,0 +1,79 @@ + + +Email: {user.email}
-Username: {user.username}
- {/if} +