174 lines
4.4 KiB
Go
174 lines
4.4 KiB
Go
package user
|
|
|
|
import (
|
|
"strings"
|
|
|
|
"git.ex.umbach.dev/LMS/libcore/models"
|
|
"github.com/gofiber/fiber/v2"
|
|
"github.com/google/uuid"
|
|
"lms.de/backend/modules/database"
|
|
"lms.de/backend/modules/structs"
|
|
"lms.de/backend/modules/utils"
|
|
"lms.de/backend/socketclients"
|
|
)
|
|
|
|
func GetUserProfile(c *fiber.Ctx) error {
|
|
// swagger:operation GET /user/profile user getUserProfile
|
|
// ---
|
|
// summary: Get user profile
|
|
// consumes:
|
|
// - application/json
|
|
// produces:
|
|
// - application/json
|
|
// responses:
|
|
// '200':
|
|
// description: User profile fetched successfully
|
|
// schema:
|
|
// "$ref": "#/definitions/GetUserProfileResponse"
|
|
// '400':
|
|
// description: Invalid request body
|
|
// '500':
|
|
// description: Failed to fetch account
|
|
|
|
var user structs.GetUserProfileResponse
|
|
|
|
database.DB.Model(&models.User{}).
|
|
Select("email", "first_name", "last_name", "profile_picture_url", "role_id").
|
|
Where("id = ?", c.Locals("userId").(string)).
|
|
First(&user)
|
|
|
|
return c.JSON(user)
|
|
}
|
|
|
|
func UpdateUserProfilePicture(c *fiber.Ctx) error {
|
|
// swagger:operation POST /user/profile/picture user updateUserProfilePicture
|
|
// ---
|
|
// summary: Update user profile picture
|
|
// consumes:
|
|
// - application/json
|
|
// produces:
|
|
// - application/json
|
|
// parameters:
|
|
// - name: file
|
|
// in: formData
|
|
// type: file
|
|
// required: true
|
|
// responses:
|
|
// '200':
|
|
// description: Profile picture updated successfully
|
|
// schema:
|
|
// type: string
|
|
// '400':
|
|
// description: Invalid request body
|
|
// '500':
|
|
// description: Failed to update profile picture
|
|
|
|
fileHeader, err := c.FormFile("file")
|
|
|
|
if err != nil {
|
|
return c.SendStatus(fiber.StatusBadRequest)
|
|
}
|
|
|
|
if fileHeader.Size > utils.MaxImageSize {
|
|
return c.SendStatus(fiber.StatusBadRequest)
|
|
}
|
|
|
|
if !utils.IsFileTypeAllowed(fileHeader.Header.Get("Content-Type"), utils.AcceptedImageFileTypes) {
|
|
return c.SendStatus(fiber.StatusBadRequest)
|
|
}
|
|
|
|
// get current profile picture
|
|
|
|
user := models.User{}
|
|
|
|
if err := database.DB.Model(&models.User{}).
|
|
Select("profile_picture_url").
|
|
Where("id = ?", c.Locals("userId").(string)).
|
|
First(&user).Error; err != nil {
|
|
return c.SendStatus(fiber.StatusInternalServerError)
|
|
}
|
|
|
|
// delete current profile picture
|
|
|
|
if user.ProfilePictureUrl != "" {
|
|
utils.DeleteFile(user.ProfilePictureUrl)
|
|
}
|
|
|
|
fileName := uuid.New().String() + "." + strings.Split(fileHeader.Header["Content-Type"][0], "/")[1]
|
|
|
|
databasePath, publicPath := utils.GetFullImagePathForUserProfilePicture(c.Locals("organizationId").(string))
|
|
|
|
utils.CreateFolderStructureIfNotExists(publicPath)
|
|
|
|
profilePictureUrl := databasePath + fileName
|
|
|
|
if err := database.DB.Model(&models.User{}).
|
|
Where("id = ?", c.Locals("userId").(string)).
|
|
Update("profile_picture_url", profilePictureUrl).Error; err != nil {
|
|
return c.SendStatus(fiber.StatusInternalServerError)
|
|
}
|
|
|
|
if err := c.SaveFile(fileHeader, publicPath+fileName); err != nil {
|
|
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
|
|
"error": "Failed to save file",
|
|
})
|
|
}
|
|
|
|
socketclients.SendMessageToUserWithTopicExceptBrowserTabSession(
|
|
c.Locals("userId").(string),
|
|
utils.SubscribedTopicUserProfile,
|
|
c.Locals("browserTabSession").(string),
|
|
structs.SendSocketMessage{
|
|
Cmd: utils.SendCmdUserProfilePictureUpdated,
|
|
Body: profilePictureUrl,
|
|
},
|
|
)
|
|
|
|
return c.JSON(fiber.Map{
|
|
"Data": databasePath + fileName,
|
|
})
|
|
}
|
|
|
|
func GetUser(c *fiber.Ctx) error {
|
|
// swagger:operation GET /user/{userId} user getUser
|
|
// ---
|
|
// summary: Get user
|
|
// consumes:
|
|
// - application/json
|
|
// produces:
|
|
// - application/json
|
|
// parameters:
|
|
// - name: userId
|
|
// in: path
|
|
// type: string
|
|
// required: true
|
|
// responses:
|
|
// '200':
|
|
// description: User fetched successfully
|
|
// schema:
|
|
// "$ref": "#/definitions/GetUserResponse"
|
|
// '400':
|
|
// description: Invalid request body
|
|
// '404':
|
|
// description: User not found
|
|
// '500':
|
|
// description: Failed to fetch user
|
|
|
|
var params structs.UserIdParam
|
|
|
|
if err := c.ParamsParser(¶ms); err != nil {
|
|
return c.SendStatus(fiber.StatusBadRequest)
|
|
}
|
|
|
|
var user structs.GetUserResponse
|
|
|
|
if err := database.DB.Model(&models.User{}).
|
|
Select("id", "first_name", "last_name", "profile_picture_url").
|
|
Where("id = ? AND organization_id = ?", params.UserId, c.Locals("organizationId").(string)).
|
|
First(&user).Error; err != nil {
|
|
return c.SendStatus(fiber.StatusNotFound)
|
|
}
|
|
|
|
return c.JSON(user)
|
|
}
|