File size: 2,996 Bytes
7af3ebd
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
package controllers

import (
	"abdanhafidz.com/go-boilerplate/models/dto"
	entity "abdanhafidz.com/go-boilerplate/models/entity"
	"abdanhafidz.com/go-boilerplate/services"
	"github.com/gin-gonic/gin"
	"github.com/google/uuid"
)

type SuperAdminOrganizationController interface {
	CreateOrganization(ctx *gin.Context)
	ListOrganizations(ctx *gin.Context)
	UpdateOrganization(ctx *gin.Context)
	DeleteOrganization(ctx *gin.Context)
}

type superAdminOrganizationController struct {
	orgService services.OrganizationService
}

func NewSuperAdminOrganizationController(orgService services.OrganizationService) SuperAdminOrganizationController {
	return &superAdminOrganizationController{orgService: orgService}
}

func (c *superAdminOrganizationController) CreateOrganization(ctx *gin.Context) {
	req := RequestJSON[dto.CreateOrganizationRequest](ctx)

	callerID := ParseAccountId(ctx)

	org, err := c.orgService.Create(ctx.Request.Context(), callerID, req)
	if err != nil {
		ResponseJSON(ctx, req, dto.OrganizationResponse{}, err)
		return
	}

	res := toOrganizationResponse(org)
	ResponseJSON(ctx, req, res, nil)
}

func (c *superAdminOrganizationController) ListOrganizations(ctx *gin.Context) {
	callerID := ParseAccountId(ctx)

	orgs, err := c.orgService.GetAll(ctx.Request.Context(), callerID)
	if err != nil {
		ResponseJSON(ctx, gin.H{}, []dto.OrganizationResponse{}, err)
		return
	}

	res := make([]dto.OrganizationResponse, len(orgs))
	for i, org := range orgs {
		res[i] = toOrganizationResponse(org)
	}

	ResponseJSON(ctx, gin.H{}, res, nil)
}

func (c *superAdminOrganizationController) UpdateOrganization(ctx *gin.Context) {
	idParam := ctx.Param("organization_id")
	orgID, err := uuid.Parse(idParam)
	if err != nil {
		ResponseJSON(ctx, gin.H{"id": idParam}, dto.OrganizationResponse{}, err)
		return
	}

	req := RequestJSON[dto.UpdateOrganizationRequest](ctx)

	callerID := ParseAccountId(ctx)

	org, err := c.orgService.Update(ctx.Request.Context(), callerID, orgID, req)
	if err != nil {
		ResponseJSON(ctx, req, dto.OrganizationResponse{}, err)
		return
	}

	res := toOrganizationResponse(org)
	ResponseJSON(ctx, req, res, nil)
}

func (c *superAdminOrganizationController) DeleteOrganization(ctx *gin.Context) {
	idParam := ctx.Param("organization_id")
	orgID, err := uuid.Parse(idParam)
	if err != nil {
		ResponseJSON[any](ctx, gin.H{"id": idParam}, nil, err)
		return
	}

	callerID := ParseAccountId(ctx)

	err = c.orgService.Delete(ctx.Request.Context(), callerID, orgID)
	if err != nil {
		ResponseJSON[any](ctx, gin.H{"id": orgID}, nil, err)
		return
	}

	ResponseJSON(ctx, gin.H{"id": orgID}, gin.H{"message": "Organization deleted successfully"}, nil)
}

func toOrganizationResponse(org entity.Organization) dto.OrganizationResponse {
	return dto.OrganizationResponse{
		Id:        org.Id,
		Name:      org.Name,
		Slug:      org.Slug,
		CreatedAt: org.CreatedAt.Format("2006-01-02T15:04:05Z07:00"),
		UpdatedAt: org.UpdatedAt.Format("2006-01-02T15:04:05Z07:00"),
	}
}