diff --git a/.air.toml b/.air.toml index 6b2c951..498951f 100644 --- a/.air.toml +++ b/.air.toml @@ -4,8 +4,8 @@ tmp_dir = "tmp" [build] args_bin = [] - bin = "tmp\\main.exe" - cmd = "go build -o ./tmp/main.exe ." + bin = "./tmp/main" + cmd = "go build -o ./tmp/main ." delay = 1000 exclude_dir = ["assets", "tmp", "vendor", "testdata"] exclude_file = [] diff --git a/dto/dashboard-dto.go b/dto/dashboard-dto.go new file mode 100644 index 0000000..a55184f --- /dev/null +++ b/dto/dashboard-dto.go @@ -0,0 +1,63 @@ +package dto + +type ResponseStatistik struct { + TotalPeserta string `json:"total_peserta"` + PesertaSeminar string `json:"peserta_seminar"` + PesertaHackaton string `json:"peserta_hackaton"` + PesertaCP string `json:"peserta_cp"` +} + +type Seminar struct { + ID int `json:"id"` + NamaPeserta string `json:"nama_peserta"` + Email string `json:"email"` + NomorHp string `json:"nomor_hp"` + Jenjang string `json:"jenjang"` + NamaUniversitas string `json:"nama_universitas"` + Dokumen string `json:"dokumen"` + Status bool `json:"status"` +} + +type ResponseSeminar struct { + Seminar Seminar `json:"seminar"` + HasMore bool `json:"has_more"` +} + +type Hackaton struct { + ID int `json:"id"` + NamaTim string `json:"nama_tim"` + Leader string `json:"leader"` + Anggota1 string `json:"anggota_1"` + Anggota2 string `json:"anggota_2"` + Anggota3 string `json:"anggota_3"` + Anggota4 string `json:"anggota_4"` + Anggota5 string `json:"anggota_5"` + KomitmenFee string `json:"komitmen_fee"` + ProposalUrl string `json:"proposal_url"` + PitchDeckUrl string `json:"pitch_deck_url"` + GithubUrl string `json:"github_url"` + Stage string `json:"stage"` +} + +type ResponseHackaton struct { + Hackaton Hackaton `json:"hackaton"` + HasMore bool `json:"has_more"` +} + +type Cp struct { + ID int `json:"id"` + NamaTim string `json:"nama_tim"` + Leader string `json:"leader"` + Anggota1 string `json:"anggota_1"` + Anggota2 string `json:"anggota_2"` + Anggota3 string `json:"anggota_3"` + KomitmenFee string `json:"komitmen_fee"` + Email string `json:"email"` + Password string `json:"password"` + Stage string `json:"stage"` +} + +type ResponseCp struct { + Cp Cp `json:"cp"` + HasMore bool `json:"has_more"` +} diff --git a/dto/event-dto.go b/dto/event-dto.go new file mode 100644 index 0000000..33ab693 --- /dev/null +++ b/dto/event-dto.go @@ -0,0 +1,42 @@ +package dto + +import "time" + +type User struct { + Name string `json:"name"` + Email string `json:"email"` + University string `json:"university"` + Degree string `json:"degree"` +} + +type Member struct { + Name string `json:"name"` + Role string `json:"role"` + Email string `json:"email"` +} + +type Team struct { + TeamName string `json:"team_name"` + Members []Member `json:"members"` +} + +type Ticket struct { + TicketId string `json:"ticket_id"` + Type string `json:"type"` + IssuedAt time.Time `json:"issued_at"` + ValidUntil time.Time `json:"valid_until"` + QrCodeUrl string `json:"qr_code_url"` +} + +type Event struct { + Name string `json:"name"` + Status string `json:"status"` + PaymentStatus string `json:"payment_status"` + Team []Team `json:"team"` + Ticket Ticket `json:"ticket"` +} + +type ResponseEvents struct { + User User `json:"user"` + Events []Event `json:"events"` +} diff --git a/dto/tes.json b/dto/tes.json new file mode 100644 index 0000000..cb055a1 --- /dev/null +++ b/dto/tes.json @@ -0,0 +1,72 @@ +{ + "user": { + "name": "Prajoko Susilo", + "email": "danantara@esemka.gov.id", + "university": "Universitas Gundarma", + "degree": "Strata 1" + }, + "events": [ + { + "name": "Competitive Programming", + "status": "Registered", + "payment_status": "Paid", + "team": { + "team_name": "Algorangers", + "members": [ + { + "name": "Prajoko Susilo", + "role": "Leader", + "email": "danantara@esemka.gov.id" + }, + { + "name": "Dina Wulandari", + "role": "Member", + "email": "dina@esemka.gov.id" + }, + { + "name": "Rizal Hakim", + "role": "Member", + "email": "rizal@esemka.gov.id" + } + ] + } + }, + { + "name": "Hackathon", + "status": "Registered", + "payment_status": "Unpaid", + "team": { + "team_name": "CodeStorm", + "members": [ + { + "name": "Prajoko Susilo", + "role": "Developer", + "email": "danantara@esemka.gov.id" + }, + { + "name": "Santi Nurhidayah", + "role": "UI/UX Designer", + "email": "santi@esemka.gov.id" + }, + { + "name": "Budi Prasetyo", + "role": "Project Manager", + "email": "budi@esemka.gov.id" + } + ] + } + }, + { + "name": "Seminar Nasional Teknologi AI", + "status": "Registered", + "payment_status": "Paid", + "ticket": { + "ticket_id": "TKT-AI2025-00123", + "type": "General Admission", + "issued_at": "2025-04-20T09:45:00Z", + "valid_until": "2025-04-28T17:00:00Z", + "qr_code_url": "https://gcwug.id/ticket/TKT-AI2025-00123/qr" + } + } + ] +} \ No newline at end of file diff --git a/entity/cp_team.go b/entity/cp_team.go index 131ff36..ba29b9d 100644 --- a/entity/cp_team.go +++ b/entity/cp_team.go @@ -10,7 +10,9 @@ type CPTeam struct { DomjudgePassword string `gorm:"varchar(255); not null"` IDTeam uint64 `gorm:"not null"` + Team Team `gorm:"foreignKey:IDTeam"` + IsDeleted bool CreatedAt time.Time UpdatedAt time.Time } diff --git a/entity/hackathon_team.go b/entity/hackathon_team.go index b326571..fa60d8e 100644 --- a/entity/hackathon_team.go +++ b/entity/hackathon_team.go @@ -13,6 +13,7 @@ type HackathonTeam struct { IDTeam uint64 Team Team `gorm:"foreignKey:IDTeam"` + IsDeleted bool CreatedAt time.Time UpdatedAt time.Time } diff --git a/entity/seminar.go b/entity/seminar.go index 6951aec..69e8787 100644 --- a/entity/seminar.go +++ b/entity/seminar.go @@ -6,9 +6,11 @@ type Seminar struct { ID_Seminar uint64 `gorm:"primary_key:auto_increment"` ID_Tiket string `gorm:"varchar(255); not null"` - IDUser uint64 `gorm:"not null"` - User User `gorm:"foreignKey:IDUser"` - + IDUser uint64 `gorm:"not null"` + User User `gorm:"foreignKey:IDUser;references:ID"` + PaymentStatus string `gorm:"type:varchar(60)"` + + IsDeleted bool CreatedAt time.Time UpdatedAt time.Time } diff --git a/entity/team.go b/entity/team.go index ea64112..e4198b1 100644 --- a/entity/team.go +++ b/entity/team.go @@ -8,6 +8,7 @@ type Team struct { Supervisor string `gorm:"varchar(255); not null"` SupervisorNIDN string `gorm:"varchar(255); not null"` JoinCode string `gorm:"varchar(255); not null"` + KomitmenFee string `gorm:"varchar(255)"` Event string `gorm:"varchar(255); not null"` diff --git a/entity/user.go b/entity/user.go index 6e70c76..c26d362 100644 --- a/entity/user.go +++ b/entity/user.go @@ -8,12 +8,15 @@ type User struct { ID uint64 `gorm:"primary_key:auto_increment"` Email string `gorm:"varchar(255); not null"` - Name string `gorm:"varchar(55); not null"` - Gender *string `gorm:"varchar(55);"` - NIM *string `gorm:"varchar(55);"` - BirthPlace *string `gorm:"varchar(55);"` - BirthDate *time.Time `gorm:"date"` - Institusi *string `gorm:"varchar(55);"` + Name string `gorm:"varchar(55); not null"` + Gender *string `gorm:"varchar(55);"` + NIM *string `gorm:"varchar(55);"` + BirthPlace *string `gorm:"varchar(55);"` + BirthDate *time.Time `gorm:"date"` + Institusi string `gorm:"varchar(55);"` + Phone string `gorm:"type:varchar(16)"` + DokumenFilename string `gorm:"type:varchar(255)"` + Jenjang string `gorm:"type:varchar(120)"` ProfileHasUpdated bool `gorm:"bool; default:false"` DataHasVerified bool `gorm:"bool; default:false"` @@ -22,7 +25,7 @@ type User struct { Role string `gorm:"varchar(255); not null; default:'user'"` // user, admin, superadmin IDTeam *uint64 - Team Team `gorm:"foreignKey:IDTeam"` + Team Team `gorm:"foreignKey:IDTeam;references:ID_Team"` CreatedAt time.Time UpdatedAt time.Time diff --git a/go.mod b/go.mod index 8ba79c9..0603144 100644 --- a/go.mod +++ b/go.mod @@ -25,6 +25,7 @@ require ( github.com/PuerkitoBio/purell v1.2.1 // indirect github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect + github.com/gin-contrib/cors v1.7.5 // indirect github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-openapi/jsonpointer v0.21.1 // indirect @@ -76,7 +77,7 @@ require ( github.com/gin-contrib/sse v1.0.0 // indirect github.com/go-playground/locales v0.14.1 // indirect github.com/go-playground/universal-translator v0.18.1 // indirect - github.com/go-playground/validator/v10 v10.25.0 // indirect + github.com/go-playground/validator/v10 v10.26.0 // indirect github.com/goccy/go-json v0.10.5 // indirect github.com/jackc/pgpassfile v1.0.0 // indirect github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect @@ -94,11 +95,11 @@ require ( github.com/twitchyliquid64/golang-asm v0.15.1 // indirect github.com/ugorji/go/codec v1.2.12 // indirect golang.org/x/arch v0.15.0 // indirect - golang.org/x/net v0.37.0 // indirect + golang.org/x/net v0.38.0 // indirect golang.org/x/sync v0.12.0 // indirect golang.org/x/sys v0.31.0 // indirect golang.org/x/text v0.23.0 // indirect google.golang.org/api v0.226.0 - google.golang.org/protobuf v1.36.5 // indirect + google.golang.org/protobuf v1.36.6 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index 071f2a0..4ae8d24 100644 --- a/go.sum +++ b/go.sum @@ -71,6 +71,8 @@ github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uq github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk= github.com/gabriel-vasile/mimetype v1.4.8 h1:FfZ3gj38NjllZIeJAmMhr+qKL8Wu+nOoI3GqacKw1NM= github.com/gabriel-vasile/mimetype v1.4.8/go.mod h1:ByKUIKGjh1ODkGM1asKUbQZOLGrPjydw3hYPU2YU9t8= +github.com/gin-contrib/cors v1.7.5 h1:cXC9SmofOrRg0w9PigwGlHG3ztswH6bqq4vJVXnvYMk= +github.com/gin-contrib/cors v1.7.5/go.mod h1:4q3yi7xBEDDWKapjT2o1V7mScKDDr8k+jZ0fSquGoy0= github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= github.com/gin-contrib/sse v1.0.0 h1:y3bT1mUWUxDpW4JLQg/HnTqV4rozuW4tC9eFKTxYI9E= @@ -100,6 +102,8 @@ github.com/go-playground/validator/v10 v10.20.0 h1:K9ISHbSaI0lyB2eWMPJo+kOS/FBEx github.com/go-playground/validator/v10 v10.20.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM= github.com/go-playground/validator/v10 v10.25.0 h1:5Dh7cjvzR7BRZadnsVOzPhWsrwUr0nmsZJxEAnFLNO8= github.com/go-playground/validator/v10 v10.25.0/go.mod h1:GGzBIJMuE98Ic/kJsBXbz1x/7cByt++cQ+YOuDM5wus= +github.com/go-playground/validator/v10 v10.26.0 h1:SP05Nqhjcvz81uJaRfEV0YBSSSGMc/iMaVtFbr3Sw2k= +github.com/go-playground/validator/v10 v10.26.0/go.mod h1:I5QpIEbmr8On7W0TktmJAumgzX4CA1XNl4ZmDuVHKKo= github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/goccy/go-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4= @@ -224,6 +228,8 @@ golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.37.0 h1:1zLorHbz+LYj7MQlSf1+2tPIIgibq2eL5xkrGk6f+2c= golang.org/x/net v0.37.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8= +golang.org/x/net v0.38.0 h1:vRMAPTMaeGqVhG5QyLJHqNDwecKTomGeqbnfZyKlBI8= +golang.org/x/net v0.38.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8= golang.org/x/oauth2 v0.28.0 h1:CrgCKl8PPAVtLnU3c+EDw6x11699EWlsDeWNWKdIOkc= golang.org/x/oauth2 v0.28.0/go.mod h1:onh5ek6nERTohokkhCD/y2cV4Do3fxFHFuAejCkRWT8= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -264,6 +270,8 @@ google.golang.org/grpc v1.71.0 h1:kF77BGdPTQ4/JZWMlb9VpJ5pa25aqvVqogsxNHHdeBg= google.golang.org/grpc v1.71.0/go.mod h1:H0GRtasmQOh9LkFoCPDu3ZrwUtD1YGE+b2vYBYd/8Ec= google.golang.org/protobuf v1.36.5 h1:tPhr+woSbjfYvY6/GPufUoYizxw1cF/yFoxJ2fmpwlM= google.golang.org/protobuf v1.36.5/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= +google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY= +google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/handler/dashboard.go b/handler/dashboard.go new file mode 100644 index 0000000..fcdec33 --- /dev/null +++ b/handler/dashboard.go @@ -0,0 +1,161 @@ +package handler + +import ( + "gcw/dto" + "gcw/helper" + "gcw/service" + "net/http" + "strconv" + + "github.com/gin-gonic/gin" + "gorm.io/gorm" +) + +type dashboardController struct { + Service service.DashboardServices +} + +type DashboardControllerInterface interface { + Statistics(*gin.Context) + GetAllDashboard(*gin.Context) + Update(*gin.Context) + Delete(*gin.Context) + GetEvent(*gin.Context) +} + +func DashboardController(db *gorm.DB) DashboardControllerInterface { + return &dashboardController{ + Service: service.NewDashboardServices(db), + } +} + +func (h *dashboardController) Statistics(c *gin.Context) {} + +func (h *dashboardController) GetAllDashboard(c *gin.Context) { + acara := c.Param("acara") + strCount := c.Param("count") + strPage := c.Param("page") + + count, errCount := strconv.Atoi(strCount) + page, errPage := strconv.Atoi(strPage) + + if errCount != nil || errPage != nil { + c.JSON(http.StatusBadRequest, helper.CreateErrorResponse("BAD_REQUEST", "count or page are error")) + } + + var respondData interface{} + + switch acara { + case "seminar": + data, err := h.Service.GetAllSeminar(count, page) + if err != nil { + c.JSON(http.StatusBadRequest, helper.CreateErrorResponse("BAD_REQUEST", "error service")) + return + } + + respondData = data + + case "hackaton": + data, err := h.Service.GetAllHackaton(count, page) + if err != nil { + c.JSON(http.StatusBadRequest, helper.CreateErrorResponse("BAD_REQUEST", "error service")) + return + } + + respondData = data + + case "cp": + data, err := h.Service.GetAllCp(count, page) + if err != nil { + c.JSON(http.StatusBadRequest, helper.CreateErrorResponse("BAD_REQUEST", "error service")) + return + } + + respondData = data + + default: + c.JSON(http.StatusBadRequest, helper.CreateErrorResponse("BAD_REQUEST", "kegiatan not found")) + return + } + + c.JSON(http.StatusOK, helper.CreateSuccessResponse("SUCCESS", respondData)) +} + +func (h *dashboardController) Update(c *gin.Context) { + acara := c.Param(":acara") + id := c.Param(":id") + + switch acara { + case "seminar": + var input dto.Seminar + if err := c.ShouldBindJSON(&input).Error; err != nil { + c.JSON(http.StatusBadRequest, helper.CreateErrorResponse("BAD_REQUEST", "BAD_REQUEST")) + return + } + + if err := h.Service.UpdateSeminarService(id, input); err != nil { + c.JSON(http.StatusInternalServerError, helper.CreateErrorResponse("ERROR", "error service")) + return + } + + case "hackaton": + var input dto.Hackaton + if err := c.ShouldBindJSON(&input).Error; err != nil { + c.JSON(http.StatusBadRequest, helper.CreateErrorResponse("BAD_REQUEST", "BAD_REQUEST")) + return + } + + if err := h.Service.UpdateHackatonService(id, input); err != nil { + c.JSON(http.StatusInternalServerError, helper.CreateErrorResponse("ERROR", "error service")) + return + } + + case "cp": + var input dto.Cp + if err := c.ShouldBindJSON(&input).Error; err != nil { + c.JSON(http.StatusBadRequest, helper.CreateErrorResponse("BAD_REQUEST", "BAD_REQUEST")) + return + } + + if err := h.Service.UpdateCpService(id, input); err != nil { + c.JSON(http.StatusInternalServerError, helper.CreateErrorResponse("ERROR", "error service")) + return + } + + default: + c.JSON(http.StatusBadRequest, helper.CreateErrorResponse("BAD_REQUEST", "kegiatan not found")) + return + } + + c.JSON(http.StatusOK, helper.CreateSuccessResponse("UPDATED", id)) +} + +func (h *dashboardController) Delete(c *gin.Context) { + acara := c.Param(":acara") + id := c.Param(":id") + + if acara != "seminar" && acara != "hackaton" && acara != "cp" { + c.JSON(http.StatusBadRequest, helper.CreateErrorResponse("BAD_REQUEST", "kegiatan not found")) + return + } + + id_user, err := h.Service.DeletePesertaService(acara, id) + if err != nil { + c.JSON(http.StatusBadRequest, helper.CreateErrorResponse("BAD_REQUEST", "Error delete service")) + return + } + + c.JSON(http.StatusOK, helper.CreateSuccessResponse("UPDATED", id_user)) +} + +func (h *dashboardController) GetEvent(c *gin.Context) { + idUser := c.Param("id_user") + + dataEvent, err := h.Service.GetEventSevice(idUser) + if err != nil { + c.JSON(http.StatusBadRequest, helper.CreateErrorResponse("BAD_REQUEST", "data not found")) + return + } + + c.JSON(http.StatusOK, helper.CreateSuccessResponse("FOUND", dataEvent)) +} diff --git a/router/setup.go b/router/setup.go index ef39931..6e18eb5 100644 --- a/router/setup.go +++ b/router/setup.go @@ -36,6 +36,8 @@ var ( newsletterHandler = handler.NewNewsletterHandler(newsletterService) authMiddleware = middleware.NewAuthMiddleware(authService, jwtService) + + dashboards = handler.DashboardController(database) ) func SetupRouter(r *gin.Engine) { @@ -71,14 +73,23 @@ func SetupRouter(r *gin.Engine) { // router.POST("profile/post", profileHandler.Create) // router.GET("profile/get", profileHandler.GetProfile) - // admin_api_base_url := os.Getenv("ADMIN_API_BASE_URL") - // admin_router := r.Group(admin_api_base_url) + admin_api_base_url := os.Getenv("ADMIN_API_BASE_URL") + admin_router := r.Group(admin_api_base_url) - newsletter := r.Group("/newsletter") + newsletter := router.Group("/newsletter") { newsletter.POST("/", newsletterHandler.CreateNewsletter) newsletter.GET("/:id", newsletterHandler.GetNewsLetter) newsletter.PUT("/:id", newsletterHandler.UpdateNewsLetter) newsletter.DELETE("/:id", newsletterHandler.DeleteNewsLetter) } + + dashboard := admin_router.Group("/dashboard") + dashboardUnauth := router.Group("/dashboard") + { + dashboard.POST("/:acara/:count/:page", dashboards.GetAllDashboard) + dashboard.DELETE("/:acara/:id", dashboards.Delete) + dashboard.PUT("/:acara/:id", dashboards.Update) + dashboardUnauth.GET("/events/:id_user", dashboards.GetEvent) + } } diff --git a/service/dashboard-service.go b/service/dashboard-service.go new file mode 100644 index 0000000..7978e76 --- /dev/null +++ b/service/dashboard-service.go @@ -0,0 +1,379 @@ +package service + +import ( + "gcw/dto" + "gcw/entity" + + "gorm.io/gorm" +) + +type DashboardServices struct { + DB *gorm.DB +} + +func NewDashboardServices(db *gorm.DB) DashboardServices { + return DashboardServices{ + DB: db, + } +} + +func FindUserById(id string) {} + +func (s *DashboardServices) GetAllSeminar(count, page int) ([]dto.ResponseSeminar, error) { + var dataSeminars []entity.Seminar + + offset := page * count + + if err := s.DB.Preload("User"). + Limit(count + 1). + Offset(offset). + Find(&dataSeminars).Error; err != nil { + return []dto.ResponseSeminar{}, err + } + + hasMore := false + + if len(dataSeminars) > count { + hasMore = true + dataSeminars = dataSeminars[:count] + } + + var responseData []dto.ResponseSeminar + + for _, data := range dataSeminars { + dataSeminar := dto.Seminar{ + ID: int(data.ID_Seminar), + NamaPeserta: data.User.Name, + Email: data.User.Email, + NomorHp: data.User.Phone, + Jenjang: data.User.Jenjang, + NamaUniversitas: data.User.Institusi, + Dokumen: data.User.DokumenFilename, + Status: data.User.DataHasVerified, + } + + response := dto.ResponseSeminar{ + Seminar: dataSeminar, + HasMore: hasMore, + } + + responseData = append(responseData, response) + } + + return responseData, nil +} + +func (s *DashboardServices) GetAllHackaton(count, page int) ([]dto.ResponseHackaton, error) { + var dataSeminars []entity.HackathonTeam + + offset := page * count + + if err := s.DB.Preload("Team"). + Limit(count + 1). + Offset(offset). + Find(&dataSeminars).Error; err != nil { + return []dto.ResponseHackaton{}, err + } + + hasMore := false + + if len(dataSeminars) > count { + hasMore = true + dataSeminars = dataSeminars[:count] + } + + var responseData []dto.ResponseHackaton + + for _, data := range dataSeminars { + var Leader entity.User + if err := s.DB.Where("IDTeam = ?", data.Team.ID_Team).First(&Leader).Error; err != nil { + return []dto.ResponseHackaton{}, err + } + + dataHackaton := dto.Hackaton{ + ID: int(data.ID_HackathonTeam), + NamaTim: data.Team.TeamName, + Leader: Leader.Name, + KomitmenFee: data.Team.KomitmenFee, + ProposalUrl: data.ProposalUrl, + PitchDeckUrl: data.PitchDeckUrl, + GithubUrl: data.GithubProjectUrl, + Stage: data.Stage, + } + + var anggota []entity.User + if err := s.DB.Where("IDTeam = ?", dataHackaton.ID).Find(&anggota).Error; err != nil { + return []dto.ResponseHackaton{}, err + } + + if len(anggota) > 0 { + dataHackaton.Anggota1 = anggota[0].Name + } + if len(anggota) > 1 { + dataHackaton.Anggota2 = anggota[1].Name + } + if len(anggota) > 2 { + dataHackaton.Anggota3 = anggota[2].Name + } + if len(anggota) > 3 { + dataHackaton.Anggota4 = anggota[3].Name + } + if len(anggota) > 4 { + dataHackaton.Anggota5 = anggota[4].Name + } + + response := dto.ResponseHackaton{ + Hackaton: dataHackaton, + HasMore: hasMore, + } + + responseData = append(responseData, response) + } + + return responseData, nil +} + +func (s *DashboardServices) GetAllCp(count, page int) ([]dto.ResponseCp, error) { + var dataSeminars []entity.CPTeam + + offset := page * count + + if err := s.DB.Preload("Team"). + Limit(count + 1). + Offset(offset). + Find(&dataSeminars).Error; err != nil { + return []dto.ResponseCp{}, err + } + + hasMore := false + + if len(dataSeminars) > count { + hasMore = true + dataSeminars = dataSeminars[:count] + } + + var responseData []dto.ResponseCp + + for _, data := range dataSeminars { + var Leader entity.User + if err := s.DB.Where("IDTeam = ?", data.Team.ID_Team).First(&Leader).Error; err != nil { + return []dto.ResponseCp{}, err + } + + dataCp := dto.Cp{ + ID: int(data.ID_CPTeam), + NamaTim: data.Team.TeamName, + Leader: Leader.Name, + KomitmenFee: data.Team.KomitmenFee, + Email: Leader.Email, + Password: data.DomjudgeUsername, + Stage: data.Stage, + } + + var anggota []entity.User + if err := s.DB.Where("IDTeam = ?", dataCp.ID).Find(&anggota).Error; err != nil { + } + + if len(anggota) > 0 { + dataCp.Anggota1 = anggota[0].Name + } + if len(anggota) > 1 { + dataCp.Anggota2 = anggota[1].Name + } + if len(anggota) > 2 { + dataCp.Anggota3 = anggota[2].Name + } + + response := dto.ResponseCp{ + Cp: dataCp, + HasMore: hasMore, + } + + responseData = append(responseData, response) + } + + return responseData, nil +} + +func (s *DashboardServices) GetEventSevice(id_user string) (dto.ResponseEvents, error) { + var user entity.User + if err := s.DB.Preload("Team").Where("id = ?", id_user).First(&user).Error; err != nil { + return dto.ResponseEvents{}, err + } + + // ambil semua member tim + var member []entity.User + if err := s.DB.Where("id_team = ?", user.IDTeam).Find(&member).Error; err != nil { + return dto.ResponseEvents{}, err + } + + // buat response user + responseUser := dto.User{ + Name: user.Name, + Email: user.Email, + University: user.Institusi, + Degree: user.Jenjang, + } + + // buat response anggota + var responseMembers []dto.Member + for _, m := range member { + role := "Member" + if m.ID == user.Team.ID_LeadTeam { + role = "Leader" + } + responseMembers = append(responseMembers, dto.Member{ + Name: m.Name, + Role: role, + Email: m.Email, + }) + } + + // ambil data event + var hackaton entity.HackathonTeam + var cp entity.CPTeam + var seminar entity.Seminar + + _ = s.DB.Where("id_team = ?", user.IDTeam).First(&hackaton) + _ = s.DB.Where("id_team = ?", user.IDTeam).First(&cp) + _ = s.DB.Where("id_user = ?", id_user).First(&seminar) + + seminarStatus := "Unregistered" + if seminar.ID_Seminar != 0 { + seminarStatus = "Registered" + } + cpStatus := "Unregistered" + if cp.ID_CPTeam != 0 { + cpStatus = "Registered" + } + hackatonStatus := "Unregistered" + if hackaton.ID_HackathonTeam != 0 { + hackatonStatus = "Registered" + } + + // isi data event + events := []dto.Event{ + { + Name: "Seminar Nasional Teknologi AI", + Status: seminarStatus, + PaymentStatus: seminar.PaymentStatus, + Ticket: dto.Ticket{}, + }, + { + Name: "Hackathon", + Status: hackatonStatus, + PaymentStatus: user.Team.KomitmenFee, + }, + { + Name: "Competitive Programming", + Status: cpStatus, + PaymentStatus: user.Team.KomitmenFee, + }, + } + + return dto.ResponseEvents{ + User: responseUser, + Events: events, + }, nil +} + +func (s *DashboardServices) DeletePesertaService(acara, id_user string) (string, error) { + var idUser string + switch acara { + case "seminar": + var data entity.Seminar + if err := s.DB.Where("id_user = ?", id_user).First(&data).Error;err!=nil{ + return "", err + } + + data.IsDeleted = true + + if err := s.DB.Save(&data).Error;err!=nil{ + return "", err + } + + case "hackaton": + var data entity.HackathonTeam + if err := s.DB.Where("id_user = ?", id_user).First(&data).Error;err!=nil{ + return "", err + } + + data.IsDeleted = true + + if err := s.DB.Save(&data).Error;err!=nil{ + return "", err + } + + case "cp": + var data entity.CPTeam + if err := s.DB.Where("id_user = ?", id_user).First(&data).Error;err!=nil{ + return "", err + } + + data.IsDeleted = true + + if err := s.DB.Save(&data).Error;err!=nil{ + return "", err + } + + } + + return idUser, nil +} + +func (s *DashboardServices) UpdateSeminarService(id string, input dto.Seminar) (error) { + var seminar entity.Seminar + if err := s.DB.Preload("User").Where("id_seminar = ?", id).First(&seminar).Error;err!=nil{ + return err + } + + seminar.User.Name = input.NamaPeserta + seminar.User.Email = input.Email + seminar.User.Phone = input.NomorHp + seminar.User.Jenjang = input.Jenjang + seminar.User.Institusi = input.NamaUniversitas + seminar.User.DokumenFilename = input.Dokumen + seminar.User.DataHasVerified = input.Status + + if err := s.DB.Save(&seminar).Error;err!=nil{ + return err + } + + return nil +} + +func (s *DashboardServices) UpdateHackatonService(id string, input dto.Hackaton) (error) { + var hackaton entity.HackathonTeam + if err := s.DB.Preload("Team").Where("id_hackaton_team = ?", id).First(&hackaton).Error;err!=nil{ + return err + } + + hackaton.Team.TeamName = input.NamaTim + hackaton.ProposalUrl = input.ProposalUrl + hackaton.GithubProjectUrl = input.GithubUrl + hackaton.PitchDeckUrl = input.PitchDeckUrl + hackaton.Stage = input.Stage + + if err := s.DB.Save(&hackaton).Error;err!=nil{ + return err + } + + return nil +} + +func (s *DashboardServices) UpdateCpService(id string, input dto.Cp) (error) { + var cp entity.CPTeam + if err := s.DB.Preload("Team").Where("id_hackaton_team = ?", id).First(&cp).Error;err!=nil{ + return err + } + + cp.Team.TeamName = input.NamaTim + cp.Stage = input.Stage + + + if err := s.DB.Save(&cp).Error;err!=nil{ + return err + } + + return nil +} \ No newline at end of file diff --git a/tmp/build-errors.log b/tmp/build-errors.log index 96f3c45..502e32e 100644 --- a/tmp/build-errors.log +++ b/tmp/build-errors.log @@ -1 +1 @@ -exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1 \ No newline at end of file +exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1 \ No newline at end of file