initial commit
This commit is contained in:
185
internal/delivery/http/platform/specialist.go
Normal file
185
internal/delivery/http/platform/specialist.go
Normal file
@@ -0,0 +1,185 @@
|
||||
package platform
|
||||
|
||||
import (
|
||||
"errors"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
"github.com/google/uuid"
|
||||
|
||||
"base/internal/domain/profile"
|
||||
"base/internal/dto"
|
||||
"base/internal/server/middleware"
|
||||
)
|
||||
|
||||
func (ctl *Controller) registerSpecialistRoutes(router *gin.RouterGroup) {
|
||||
protected := router.Use(ctl.middleware.AuthShield())
|
||||
protected.PUT("/page-sections/hero", ctl.SpecialistUpdateHero)
|
||||
protected.PUT("/page-sections/contact", ctl.SpecialistUpdateContact)
|
||||
protected.PUT("/page-sections/skills", ctl.SpecialistUpdateSkills)
|
||||
protected.GET("/page-sections", ctl.SpecialistGetPageSections)
|
||||
protected.GET("/profile", ctl.SpecialistGetProfile)
|
||||
}
|
||||
|
||||
// SpecialistUpdateHero updates the hero section of the specialist's profile.
|
||||
// @Summary update hero section
|
||||
// @Tags Specialist
|
||||
// @Accept json
|
||||
// @Produce json
|
||||
// @Security Bearer
|
||||
// @Param request body dto.HeroDTO true "hero section"
|
||||
// @Success 200 {object} dto.SuccessResponse
|
||||
// @Failure 401 {object} dto.ErrorResponse
|
||||
// @Failure 404 {object} dto.ErrorResponse
|
||||
// @Router /api/specialists/v1/page-sections/hero [put]
|
||||
func (ctl *Controller) SpecialistUpdateHero(c *gin.Context) {
|
||||
userID, err := getUserIDFromContext(c)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
var req dto.HeroDTO
|
||||
if !ctl.validateRequest(c, &req) {
|
||||
return
|
||||
}
|
||||
if err := ctl.specialistService.UpdateHero(c.Request.Context(), userID, req); err != nil {
|
||||
ctl.handleSpecialistError(c, err)
|
||||
return
|
||||
}
|
||||
r := dto.OK().WithMessage("hero updated")
|
||||
c.JSON(r.Status, r)
|
||||
}
|
||||
|
||||
// SpecialistUpdateContact updates the contact section.
|
||||
// @Summary update contact section
|
||||
// @Tags Specialist
|
||||
// @Accept json
|
||||
// @Produce json
|
||||
// @Security Bearer
|
||||
// @Param request body dto.ContactDTO true "contact section"
|
||||
// @Success 200 {object} dto.SuccessResponse
|
||||
// @Failure 401 {object} dto.ErrorResponse
|
||||
// @Failure 404 {object} dto.ErrorResponse
|
||||
// @Router /api/specialists/v1/page-sections/contact [put]
|
||||
func (ctl *Controller) SpecialistUpdateContact(c *gin.Context) {
|
||||
userID, err := getUserIDFromContext(c)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
var req dto.ContactDTO
|
||||
if !ctl.validateRequest(c, &req) {
|
||||
return
|
||||
}
|
||||
if err := ctl.specialistService.UpdateContact(c.Request.Context(), userID, req); err != nil {
|
||||
ctl.handleSpecialistError(c, err)
|
||||
return
|
||||
}
|
||||
r := dto.OK().WithMessage("contact updated")
|
||||
c.JSON(r.Status, r)
|
||||
}
|
||||
|
||||
// SpecialistUpdateSkills updates the skills section.
|
||||
// @Summary update skills section
|
||||
// @Tags Specialist
|
||||
// @Accept json
|
||||
// @Produce json
|
||||
// @Security Bearer
|
||||
// @Param request body dto.SkillsUpdateRequest true "skills section"
|
||||
// @Success 200 {object} dto.SuccessResponse
|
||||
// @Failure 401 {object} dto.ErrorResponse
|
||||
// @Failure 404 {object} dto.ErrorResponse
|
||||
// @Router /api/specialists/v1/page-sections/skills [put]
|
||||
func (ctl *Controller) SpecialistUpdateSkills(c *gin.Context) {
|
||||
userID, err := getUserIDFromContext(c)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
var req dto.SkillsUpdateRequest
|
||||
if !ctl.validateRequest(c, &req) {
|
||||
return
|
||||
}
|
||||
if err := ctl.specialistService.UpdateSkills(c.Request.Context(), userID, req); err != nil {
|
||||
ctl.handleSpecialistError(c, err)
|
||||
return
|
||||
}
|
||||
r := dto.OK().WithMessage("skills updated")
|
||||
c.JSON(r.Status, r)
|
||||
}
|
||||
|
||||
// SpecialistGetPageSections returns hero, contact, skills for the specialist.
|
||||
// @Summary get page sections
|
||||
// @Tags Specialist
|
||||
// @Produce json
|
||||
// @Security Bearer
|
||||
// @Success 200 {object} dto.PageSectionsResponse
|
||||
// @Failure 401 {object} dto.ErrorResponse
|
||||
// @Failure 404 {object} dto.ErrorResponse
|
||||
// @Router /api/specialists/v1/page-sections [get]
|
||||
func (ctl *Controller) SpecialistGetPageSections(c *gin.Context) {
|
||||
userID, err := getUserIDFromContext(c)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
resp, err := ctl.specialistService.GetPageSections(c.Request.Context(), userID)
|
||||
if err != nil {
|
||||
ctl.handleSpecialistError(c, err)
|
||||
return
|
||||
}
|
||||
r := dto.OK().WithData(resp)
|
||||
c.JSON(r.Status, r)
|
||||
}
|
||||
|
||||
// SpecialistGetProfile returns the specialist's full profile.
|
||||
// @Summary get specialist profile
|
||||
// @Tags Specialist
|
||||
// @Produce json
|
||||
// @Security Bearer
|
||||
// @Success 200 {object} dto.ProfileResponse
|
||||
// @Failure 401 {object} dto.ErrorResponse
|
||||
// @Failure 404 {object} dto.ErrorResponse
|
||||
// @Router /api/specialists/v1/profile [get]
|
||||
func (ctl *Controller) SpecialistGetProfile(c *gin.Context) {
|
||||
userID, err := getUserIDFromContext(c)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
resp, err := ctl.specialistService.GetProfile(c.Request.Context(), userID)
|
||||
if err != nil {
|
||||
ctl.handleSpecialistError(c, err)
|
||||
return
|
||||
}
|
||||
r := dto.OK().WithData(resp)
|
||||
c.JSON(r.Status, r)
|
||||
}
|
||||
|
||||
func getUserIDFromContext(c *gin.Context) (uuid.UUID, error) {
|
||||
val, exists := c.Get(middleware.UserIDKey)
|
||||
if !exists {
|
||||
c.JSON(dto.Unauthorized().Status, dto.Unauthorized())
|
||||
return uuid.Nil, errors.New("unauthorized")
|
||||
}
|
||||
|
||||
str, ok := val.(string)
|
||||
if !ok {
|
||||
c.JSON(dto.Unauthorized().Status, dto.Unauthorized())
|
||||
return uuid.Nil, errors.New("invalid user id type")
|
||||
}
|
||||
|
||||
id, err := uuid.Parse(str)
|
||||
if err != nil {
|
||||
c.JSON(dto.BadRequest().Status, dto.BadRequest().WithMessage("invalid user ID"))
|
||||
return uuid.Nil, err
|
||||
}
|
||||
|
||||
return id, nil
|
||||
}
|
||||
|
||||
func (ctl *Controller) handleSpecialistError(c *gin.Context, err error) {
|
||||
switch {
|
||||
case errors.Is(err, profile.ErrProfileNotFound):
|
||||
r := dto.NotFound().WithMessage("profile not found")
|
||||
c.JSON(r.Status, r)
|
||||
default:
|
||||
ctl.logger.Error().Err(err).Msg("specialist error")
|
||||
r := dto.InternalServerError()
|
||||
c.JSON(r.Status, r)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user