initial commit
This commit is contained in:
274
internal/delivery/http/platform/profile.go
Normal file
274
internal/delivery/http/platform/profile.go
Normal file
@@ -0,0 +1,274 @@
|
||||
package platform
|
||||
|
||||
import (
|
||||
profileDomian "base/internal/domain/profile"
|
||||
"errors"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
"github.com/google/uuid"
|
||||
|
||||
"base/internal/dto"
|
||||
)
|
||||
|
||||
// CreateProfile godoc
|
||||
// @Summary create profile
|
||||
// @Description create a new profile
|
||||
// @Tags Profile
|
||||
// @Accept json
|
||||
// @Produce json
|
||||
// @Param request body dto.CreateProfileRequest true "create profile request"
|
||||
// @Success 201 {object} dto.ProfileResponse "profile response"
|
||||
// @Failure 400 {object} dto.ErrorResponse "invalid request"
|
||||
// @Failure 500 {object} dto.ErrorResponse "internal server error"
|
||||
// @Router /api/v1/profiles [post]
|
||||
func (ctl *Controller) CreateProfile(c *gin.Context) {
|
||||
lg := ctl.logger.With().
|
||||
Str("module", "platform").
|
||||
Str("router", "profile").
|
||||
Str("handler", "CreateProfile").
|
||||
Logger()
|
||||
|
||||
var req dto.CreateProfileRequest
|
||||
if !ctl.validateRequest(c, &req) {
|
||||
return
|
||||
}
|
||||
|
||||
profile, err := ctl.profileService.Create(c.Request.Context(), req)
|
||||
if err != nil {
|
||||
lg.Error().Err(err).Msg("failed to create profile")
|
||||
r := dto.InternalServerError().WithMessage("failed to create profile")
|
||||
c.JSON(r.Status, r)
|
||||
return
|
||||
}
|
||||
|
||||
r := dto.Created(profile)
|
||||
c.JSON(r.Status, r)
|
||||
}
|
||||
|
||||
// GetProfile godoc
|
||||
// @Summary get profile by ID
|
||||
// @Description get profile by ID
|
||||
// @Tags Profile
|
||||
// @Accept json
|
||||
// @Produce json
|
||||
// @Param id path string true "profile ID"
|
||||
// @Success 200 {object} dto.ProfileResponse "profile response"
|
||||
// @Failure 400 {object} dto.ErrorResponse "invalid request"
|
||||
// @Failure 404 {object} dto.ErrorResponse "profile not found"
|
||||
// @Failure 500 {object} dto.ErrorResponse "internal server error"
|
||||
// @Router /api/v1/profiles/{id} [get]
|
||||
func (ctl *Controller) GetProfile(c *gin.Context) {
|
||||
lg := ctl.logger.With().
|
||||
Str("module", "platform").
|
||||
Str("router", "profile").
|
||||
Str("handler", "GetProfile").
|
||||
Logger()
|
||||
|
||||
var req dto.GetProfileRequest
|
||||
if !ctl.validateRequest(c, &req) {
|
||||
return
|
||||
}
|
||||
|
||||
id, err := uuid.Parse(req.ID)
|
||||
if err != nil {
|
||||
lg.Error().Err(err).Msg("invalid profile ID")
|
||||
r := dto.BadRequest().WithMessage("invalid profile ID")
|
||||
c.JSON(r.Status, r)
|
||||
return
|
||||
}
|
||||
|
||||
profile, err := ctl.profileService.GetByID(c.Request.Context(), id)
|
||||
if err != nil {
|
||||
lg.Error().Err(err).Msg("failed to get profile")
|
||||
switch {
|
||||
case errors.Is(err, profileDomian.ErrProfileNotFound):
|
||||
r := dto.NotFound().WithMessage("profile not found")
|
||||
c.JSON(r.Status, r)
|
||||
default:
|
||||
r := dto.InternalServerError()
|
||||
c.JSON(r.Status, r)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
r := dto.OK().WithData(profile)
|
||||
c.JSON(r.Status, r)
|
||||
}
|
||||
|
||||
// GetProfileByHandle godoc
|
||||
// @Summary get profile by handle
|
||||
// @Description get profile by handle
|
||||
// @Tags Profile
|
||||
// @Accept json
|
||||
// @Produce json
|
||||
// @Param handle path string true "profile handle"
|
||||
// @Success 200 {object} dto.ProfileResponse "profile response"
|
||||
// @Failure 400 {object} dto.ErrorResponse "invalid request"
|
||||
// @Failure 404 {object} dto.ErrorResponse "profile not found"
|
||||
// @Failure 500 {object} dto.ErrorResponse "internal server error"
|
||||
// @Router /api/v1/profiles/handle/{handle} [get]
|
||||
func (ctl *Controller) GetProfileByHandle(c *gin.Context) {
|
||||
lg := ctl.logger.With().
|
||||
Str("module", "platform").
|
||||
Str("router", "profile").
|
||||
Str("handler", "GetProfileByHandle").
|
||||
Logger()
|
||||
|
||||
var req dto.GetProfileByHandleRequest
|
||||
if !ctl.validateRequest(c, &req) {
|
||||
return
|
||||
}
|
||||
|
||||
profile, err := ctl.profileService.GetByHandle(c.Request.Context(), req.Handle)
|
||||
if err != nil {
|
||||
lg.Error().Err(err).Msg("failed to get profile by handle")
|
||||
switch {
|
||||
case errors.Is(err, profileDomian.ErrProfileNotFound):
|
||||
r := dto.NotFound().WithMessage("profile not found")
|
||||
c.JSON(r.Status, r)
|
||||
default:
|
||||
r := dto.InternalServerError()
|
||||
c.JSON(r.Status, r)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
r := dto.OK().WithData(profile)
|
||||
c.JSON(r.Status, r)
|
||||
}
|
||||
|
||||
// UpdateProfile godoc
|
||||
// @Summary update profile
|
||||
// @Description update an existing profile
|
||||
// @Tags Profile
|
||||
// @Accept json
|
||||
// @Produce json
|
||||
// @Param id path string true "profile ID"
|
||||
// @Param request body dto.UpdateProfileRequest true "update profile request"
|
||||
// @Success 200 {object} dto.ProfileResponse "profile response"
|
||||
// @Failure 400 {object} dto.ErrorResponse "invalid request"
|
||||
// @Failure 404 {object} dto.ErrorResponse "profile not found"
|
||||
// @Failure 500 {object} dto.ErrorResponse "internal server error"
|
||||
// @Router /api/v1/profiles/{id} [put]
|
||||
func (ctl *Controller) UpdateProfile(c *gin.Context) {
|
||||
lg := ctl.logger.With().
|
||||
Str("module", "platform").
|
||||
Str("router", "profile").
|
||||
Str("handler", "UpdateProfile").
|
||||
Logger()
|
||||
|
||||
var req dto.UpdateProfileRequest
|
||||
if !ctl.validateRequest(c, &req) {
|
||||
return
|
||||
}
|
||||
|
||||
profile, err := ctl.profileService.Update(c.Request.Context(), req)
|
||||
if err != nil {
|
||||
lg.Error().Err(err).Msg("failed to update profile")
|
||||
switch {
|
||||
case errors.Is(err, profileDomian.ErrProfileNotFound):
|
||||
r := dto.NotFound().WithMessage("profile not found")
|
||||
c.JSON(r.Status, r)
|
||||
default:
|
||||
r := dto.InternalServerError()
|
||||
c.JSON(r.Status, r)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
r := dto.OK().WithData(profile)
|
||||
c.JSON(r.Status, r)
|
||||
}
|
||||
|
||||
// ListProfiles godoc
|
||||
// @Summary list profiles
|
||||
// @Description list profiles with filtering and pagination
|
||||
// @Tags Profile
|
||||
// @Accept json
|
||||
// @Produce json
|
||||
// @Param role_id query string false "role ID"
|
||||
// @Param first_name query string false "first name"
|
||||
// @Param last_name query string false "last name"
|
||||
// @Param company query string false "company"
|
||||
// @Param skill_name query string false "skill name"
|
||||
// @Param page query int false "page number" default(1)
|
||||
// @Param page_size query int false "page size" default(10)
|
||||
// @Param sorted_by query string false "sort field"
|
||||
// @Param ascending query bool false "ascending order" default(false)
|
||||
// @Success 200 {object} dto.ListProfilesResponse "list profiles response"
|
||||
// @Failure 400 {object} dto.ErrorResponse "invalid request"
|
||||
// @Failure 500 {object} dto.ErrorResponse "internal server error"
|
||||
// @Router /api/v1/profiles [get]
|
||||
func (ctl *Controller) ListProfiles(c *gin.Context) {
|
||||
lg := ctl.logger.With().
|
||||
Str("module", "platform").
|
||||
Str("router", "profile").
|
||||
Str("handler", "ListProfiles").
|
||||
Logger()
|
||||
|
||||
var req dto.ListProfilesRequest
|
||||
if !ctl.validateRequest(c, &req) {
|
||||
return
|
||||
}
|
||||
|
||||
profiles, err := ctl.profileService.List(c.Request.Context(), req)
|
||||
if err != nil {
|
||||
lg.Error().Err(err).Msg("failed to list profiles")
|
||||
r := dto.InternalServerError()
|
||||
c.JSON(r.Status, r)
|
||||
return
|
||||
}
|
||||
|
||||
r := dto.OK().WithData(profiles)
|
||||
c.JSON(r.Status, r)
|
||||
}
|
||||
|
||||
// DeleteProfile godoc
|
||||
// @Summary delete profile
|
||||
// @Description delete a profile
|
||||
// @Tags Profile
|
||||
// @Accept json
|
||||
// @Produce json
|
||||
// @Param id path string true "profile ID"
|
||||
// @Success 200 {object} dto.SuccessResponse "success response"
|
||||
// @Failure 400 {object} dto.ErrorResponse "invalid request"
|
||||
// @Failure 404 {object} dto.ErrorResponse "profile not found"
|
||||
// @Failure 500 {object} dto.ErrorResponse "internal server error"
|
||||
// @Router /api/v1/profiles/{id} [delete]
|
||||
func (ctl *Controller) DeleteProfile(c *gin.Context) {
|
||||
lg := ctl.logger.With().
|
||||
Str("module", "platform").
|
||||
Str("router", "profile").
|
||||
Str("handler", "DeleteProfile").
|
||||
Logger()
|
||||
|
||||
var req dto.DeleteProfileRequest
|
||||
if !ctl.validateRequest(c, &req) {
|
||||
return
|
||||
}
|
||||
|
||||
id, err := uuid.Parse(req.ID)
|
||||
if err != nil {
|
||||
lg.Error().Err(err).Msg("invalid profile ID")
|
||||
r := dto.BadRequest().WithMessage("invalid profile ID")
|
||||
c.JSON(r.Status, r)
|
||||
return
|
||||
}
|
||||
|
||||
err = ctl.profileService.Delete(c.Request.Context(), id)
|
||||
if err != nil {
|
||||
lg.Error().Err(err).Msg("failed to delete profile")
|
||||
switch {
|
||||
case errors.Is(err, profileDomian.ErrProfileNotFound):
|
||||
r := dto.NotFound().WithMessage("profile not found")
|
||||
c.JSON(r.Status, r)
|
||||
default:
|
||||
r := dto.InternalServerError()
|
||||
c.JSON(r.Status, r)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
r := dto.OK().WithMessage("profile deleted successfully")
|
||||
c.JSON(r.Status, r)
|
||||
}
|
||||
Reference in New Issue
Block a user