aditya.siregar 4f5950543e init
2025-07-18 20:10:29 +07:00

182 lines
5.0 KiB
Go

package handler
import (
"apskel-pos-be/internal/appcontext"
"apskel-pos-be/internal/contract"
"apskel-pos-be/internal/service"
"apskel-pos-be/internal/transformer"
"apskel-pos-be/internal/validator"
"net/http"
"strconv"
"github.com/gin-gonic/gin"
"github.com/google/uuid"
)
type FileHandler struct {
fileService service.FileService
validator validator.FileValidator
transformer transformer.Transformer
}
func NewFileHandler(
fileService service.FileService,
validator validator.FileValidator,
transformer transformer.Transformer,
) *FileHandler {
return &FileHandler{
fileService: fileService,
validator: validator,
transformer: transformer,
}
}
func (h *FileHandler) UploadFile(c *gin.Context) {
ctx := c.Request.Context()
contextInfo := appcontext.FromGinContext(ctx)
file, err := c.FormFile("file")
if err != nil {
h.transformer.Error(c, http.StatusBadRequest, "File is required", err)
return
}
var req contract.UploadFileRequest
if fileType := c.PostForm("file_type"); fileType != "" {
req.FileType = fileType
}
if isPublicStr := c.PostForm("is_public"); isPublicStr != "" {
if isPublic, err := strconv.ParseBool(isPublicStr); err == nil {
req.IsPublic = &isPublic
}
}
if err := h.validator.Validate(&req); err != nil {
h.transformer.Error(c, http.StatusBadRequest, "Validation failed", err)
return
}
organizationID := contextInfo.OrganizationID
userID := contextInfo.UserID
// Transform contract to model
modelReq := transformer.UploadFileContractToModel(&req)
response, err := h.fileService.UploadFile(ctx, file, modelReq, organizationID, userID)
if err != nil {
h.transformer.Error(c, http.StatusInternalServerError, "Failed to upload file", err)
return
}
// Transform model to contract
contractResp := transformer.FileModelToContract(response)
h.transformer.Success(c, http.StatusCreated, "File uploaded successfully", contractResp)
}
func (h *FileHandler) GetFileByID(c *gin.Context) {
idStr := c.Param("id")
id, err := uuid.Parse(idStr)
if err != nil {
h.transformer.Error(c, http.StatusBadRequest, "Invalid file ID", err)
return
}
response, err := h.fileService.GetFileByID(c.Request.Context(), id)
if err != nil {
h.transformer.Error(c, http.StatusInternalServerError, "Failed to get file", err)
return
}
// Transform model to contract
contractResp := transformer.FileModelToContract(response)
h.transformer.Success(c, http.StatusOK, "File retrieved successfully", contractResp)
}
func (h *FileHandler) UpdateFile(c *gin.Context) {
idStr := c.Param("id")
id, err := uuid.Parse(idStr)
if err != nil {
h.transformer.Error(c, http.StatusBadRequest, "Invalid file ID", err)
return
}
var req contract.UpdateFileRequest
if err := c.ShouldBindJSON(&req); err != nil {
h.transformer.Error(c, http.StatusBadRequest, "Invalid request body", err)
return
}
if err := h.validator.Validate(&req); err != nil {
h.transformer.Error(c, http.StatusBadRequest, "Validation failed", err)
return
}
// Transform contract to model
modelReq := transformer.UpdateFileContractToModel(&req)
response, err := h.fileService.UpdateFile(c.Request.Context(), id, modelReq)
if err != nil {
h.transformer.Error(c, http.StatusInternalServerError, "Failed to update file", err)
return
}
// Transform model to contract
contractResp := transformer.FileModelToContract(response)
h.transformer.Success(c, http.StatusOK, "File updated successfully", contractResp)
}
func (h *FileHandler) GetFilesByOrganization(c *gin.Context) {
ctx := c.Request.Context()
contextInfo := appcontext.FromGinContext(ctx)
organizationID := contextInfo.OrganizationID
response, err := h.fileService.GetFileByOrganizationID(ctx, organizationID)
if err != nil {
h.transformer.Error(c, http.StatusInternalServerError, "Failed to get files by organization", err)
return
}
// Transform model to contract
contractFiles := make([]*contract.FileResponse, len(response))
for i, file := range response {
contractFiles[i] = transformer.FileModelToContract(file)
}
contractResp := &contract.ListFilesResponse{
Files: contractFiles,
TotalCount: len(response),
Page: 1,
Limit: len(response),
TotalPages: 1,
}
h.transformer.Success(c, http.StatusOK, "Files retrieved successfully", contractResp)
}
func (h *FileHandler) GetFilesByUser(c *gin.Context) {
ctx := c.Request.Context()
contextInfo := appcontext.FromGinContext(ctx)
userID := contextInfo.UserID
response, err := h.fileService.GetFileByUserID(ctx, userID)
if err != nil {
h.transformer.Error(c, http.StatusInternalServerError, "Failed to get files by user", err)
return
}
// Transform model to contract
contractFiles := make([]*contract.FileResponse, len(response))
for i, file := range response {
contractFiles[i] = transformer.FileModelToContract(file)
}
contractResp := &contract.ListFilesResponse{
Files: contractFiles,
TotalCount: len(response),
Page: 1,
Limit: len(response),
TotalPages: 1,
}
h.transformer.Success(c, http.StatusOK, "Files retrieved successfully", contractResp)
}