meti-backend/internal/transformer/common_transformer.go
Aditya Siregar 9e95e8ee5e Init Eslogad
2025-08-09 15:09:43 +07:00

173 lines
4.1 KiB
Go

package transformer
import (
"eslogad-be/internal/contract"
"eslogad-be/internal/entities"
"math"
"github.com/google/uuid"
)
func PaginationToRequest(page, limit int) (int, int) {
if page < 1 {
page = 1
}
if limit < 1 {
limit = 10
}
if limit > 100 {
limit = 100
}
return page, limit
}
func CreatePaginationResponse(totalCount, page, limit int) contract.PaginationResponse {
totalPages := int(math.Ceil(float64(totalCount) / float64(limit)))
if totalPages < 1 {
totalPages = 1
}
return contract.PaginationResponse{
TotalCount: totalCount,
Page: page,
Limit: limit,
TotalPages: totalPages,
}
}
func CreateListUsersResponse(users []contract.UserResponse, totalCount, page, limit int) *contract.ListUsersResponse {
pagination := CreatePaginationResponse(totalCount, page, limit)
return &contract.ListUsersResponse{
Users: users,
Pagination: pagination,
}
}
func CreateErrorResponse(message string, code int) *contract.ErrorResponse {
return &contract.ErrorResponse{
Error: "error",
Message: message,
Code: code,
}
}
func CreateValidationErrorResponse(message string, details map[string]string) *contract.ValidationErrorResponse {
return &contract.ValidationErrorResponse{
Error: "validation_error",
Message: message,
Details: details,
Code: 400,
}
}
func CreateSuccessResponse(message string, data interface{}) *contract.SuccessResponse {
return &contract.SuccessResponse{
Message: message,
Data: data,
}
}
func RolesToContract(roles []entities.Role) []contract.RoleResponse {
if roles == nil {
return nil
}
res := make([]contract.RoleResponse, 0, len(roles))
for _, r := range roles {
res = append(res, contract.RoleResponse{ID: r.ID, Name: r.Name, Code: r.Code})
}
return res
}
func PositionsToContract(positions []entities.Position) []contract.PositionResponse {
if positions == nil {
return nil
}
res := make([]contract.PositionResponse, 0, len(positions))
for _, p := range positions {
res = append(res, contract.PositionResponse{ID: p.ID, Name: p.Name, Code: p.Code, Path: p.Path})
}
return res
}
func ProfileEntityToContract(p *entities.UserProfile) *contract.UserProfileResponse {
if p == nil {
return nil
}
return &contract.UserProfileResponse{
UserID: p.UserID,
FullName: p.FullName,
DisplayName: p.DisplayName,
Phone: p.Phone,
AvatarURL: p.AvatarURL,
JobTitle: p.JobTitle,
EmployeeNo: p.EmployeeNo,
Bio: p.Bio,
Timezone: p.Timezone,
Locale: p.Locale,
Preferences: map[string]interface{}(p.Preferences),
NotificationPrefs: map[string]interface{}(p.NotificationPrefs),
LastSeenAt: p.LastSeenAt,
CreatedAt: p.CreatedAt,
UpdatedAt: p.UpdatedAt,
}
}
func ProfileUpdateToEntity(userID uuid.UUID, req *contract.UpdateUserProfileRequest, existing *entities.UserProfile) *entities.UserProfile {
prof := &entities.UserProfile{}
if existing != nil {
*prof = *existing
} else {
prof.UserID = userID
}
if req.FullName != nil {
prof.FullName = *req.FullName
}
if req.DisplayName != nil {
prof.DisplayName = req.DisplayName
}
if req.Phone != nil {
prof.Phone = req.Phone
}
if req.AvatarURL != nil {
prof.AvatarURL = req.AvatarURL
}
if req.JobTitle != nil {
prof.JobTitle = req.JobTitle
}
if req.EmployeeNo != nil {
prof.EmployeeNo = req.EmployeeNo
}
if req.Bio != nil {
prof.Bio = req.Bio
}
if req.Timezone != nil {
prof.Timezone = *req.Timezone
}
if req.Locale != nil {
prof.Locale = *req.Locale
}
if req.Preferences != nil {
prof.Preferences = entities.JSONB(*req.Preferences)
}
if req.NotificationPrefs != nil {
prof.NotificationPrefs = entities.JSONB(*req.NotificationPrefs)
}
return prof
}
func TitlesToContract(titles []entities.Title) []contract.TitleResponse {
if titles == nil {
return nil
}
out := make([]contract.TitleResponse, 0, len(titles))
for _, t := range titles {
out = append(out, contract.TitleResponse{
ID: t.ID,
Name: t.Name,
Code: t.Code,
Description: t.Description,
})
}
return out
}