diff --git a/src/handler/handler.go b/src/handler/handler.go index fe4c124974d27ba382b4ad9ea9752c7bc902340f..6cdcd5bd09b20f911df263ac9bcc492323f46735 100644 --- a/src/handler/handler.go +++ b/src/handler/handler.go @@ -8,6 +8,8 @@ import ( batchSidangTransport "gitlab.informatika.org/k-01-11/graduit-be/src/module/batch_sidang/transport" bimbinganLogConfig "gitlab.informatika.org/k-01-11/graduit-be/src/module/bimbingan_log/config" bimbinganLogTransport "gitlab.informatika.org/k-01-11/graduit-be/src/module/bimbingan_log/transport" + dashboardDosbingConfig "gitlab.informatika.org/k-01-11/graduit-be/src/module/dashboard_dosbing/config" + dashboardDosbingTrasport "gitlab.informatika.org/k-01-11/graduit-be/src/module/dashboard_dosbing/transport" jadwalSeminarConfig "gitlab.informatika.org/k-01-11/graduit-be/src/module/jadwal_seminar/config" jadwalSeminarTransport "gitlab.informatika.org/k-01-11/graduit-be/src/module/jadwal_seminar/transport" jadwalSidangConfig "gitlab.informatika.org/k-01-11/graduit-be/src/module/jadwal_sidang/config" @@ -23,15 +25,16 @@ import ( ) type Service struct { - InternalSystemLogHandler *systemLogTransport.InternalSystemLogHandler - AdminSytemLogHandler *systemLogTransport.AdminSystemLogHandler - AdminBimbinganLogHandler *bimbinganLogTransport.AdminBimbinganLogHandler - AdminTopicAllocationHandler *topicAllocationTransport.AdminTopicAllocationHandler - BatchSeminarHandler *batchSeminarTransport.AdminBatchSeminarHandler - BatchSidangHandler *batchSidangTransport.AdminBatchSidangHandler - JadwalSidangHandler *jadwalSidangTransport.AdminJadwalSidangHandler - JadwalSeminarHandler *jadwalSeminarTransport.AdminJadwalSeminarHandler - AdminStatusMahasiswaHandler *statusMahasiswaTransport.AdminStatusMahasiswaHandler + InternalSystemLogHandler *systemLogTransport.InternalSystemLogHandler + AdminSytemLogHandler *systemLogTransport.AdminSystemLogHandler + AdminBimbinganLogHandler *bimbinganLogTransport.AdminBimbinganLogHandler + AdminTopicAllocationHandler *topicAllocationTransport.AdminTopicAllocationHandler + BatchSeminarHandler *batchSeminarTransport.AdminBatchSeminarHandler + BatchSidangHandler *batchSidangTransport.AdminBatchSidangHandler + JadwalSidangHandler *jadwalSidangTransport.AdminJadwalSidangHandler + JadwalSeminarHandler *jadwalSeminarTransport.AdminJadwalSeminarHandler + AdminStatusMahasiswaHandler *statusMahasiswaTransport.AdminStatusMahasiswaHandler + AdminDashboardDosbingHandler *dashboardDosbingTrasport.AdminDashboardDosbingHandler AdminPendaftaranHandler *pendaftaranTransport.AdminPendaftaranHandler } @@ -75,21 +78,26 @@ func MakeHandler() *Service { DBWrite: dbWrite, DBRead: dbRead, }) + AdminDashboardDosbingHandler := dashboardDosbingTrasport.NewAdminDashboardDosbingHandler(dashboardDosbingConfig.DashboardDosbingTransportConfig{ + DBWrite: dbWrite, + DBRead: dbRead, + }) AdminPendaftaranHandler := pendaftaranTransport.NewAdminPendaftaranHandler(pendaftaranConfig.PendaftaranTransportConfig{ DBWrite: dbWrite, DBRead: dbRead, }) return &Service{ - InternalSystemLogHandler: InternalSystemLogHandler, - AdminSytemLogHandler: AdminSystemLogHandler, - AdminBimbinganLogHandler: AdminBimbinganLogHandler, - AdminTopicAllocationHandler: AdminTopicAllocationHandler, - BatchSeminarHandler: AdminBatchSeminarHandler, - BatchSidangHandler: AdminBatchSidangHandler, - JadwalSidangHandler: AdminJadwalSidangHandler, - JadwalSeminarHandler: AdminJadwalSeminarHandler, - AdminStatusMahasiswaHandler: AdminStatusMahasiswaHandler, + InternalSystemLogHandler: InternalSystemLogHandler, + AdminSytemLogHandler: AdminSystemLogHandler, + AdminBimbinganLogHandler: AdminBimbinganLogHandler, + AdminTopicAllocationHandler: AdminTopicAllocationHandler, + BatchSeminarHandler: AdminBatchSeminarHandler, + BatchSidangHandler: AdminBatchSidangHandler, + JadwalSidangHandler: AdminJadwalSidangHandler, + JadwalSeminarHandler: AdminJadwalSeminarHandler, + AdminStatusMahasiswaHandler: AdminStatusMahasiswaHandler, + AdminDashboardDosbingHandler: AdminDashboardDosbingHandler, AdminPendaftaranHandler: AdminPendaftaranHandler, } } diff --git a/src/handler/server.go b/src/handler/server.go index 67cb667285c8a6cf650fd07e86b484bb668a6f8b..83e29b0d863f0f03692fe314934aeb5b07537285 100644 --- a/src/handler/server.go +++ b/src/handler/server.go @@ -29,6 +29,7 @@ func (s *Service) InitializeRoutes() *echo.Echo { s.JadwalSeminarHandler.MountAdmin(adminGroup) s.JadwalSidangHandler.MountAdmin(adminGroup) s.AdminStatusMahasiswaHandler.MountAdmin(adminGroup) + s.AdminDashboardDosbingHandler.MountAdmin(adminGroup) s.AdminPendaftaranHandler.MountAdmin(adminGroup) return e } diff --git a/src/module/dashboard_dosbing/config/common.go b/src/module/dashboard_dosbing/config/common.go new file mode 100644 index 0000000000000000000000000000000000000000..4adf2ccda7ef79c77ddc17425604bd60769c9f62 --- /dev/null +++ b/src/module/dashboard_dosbing/config/common.go @@ -0,0 +1,8 @@ +package config + +import "gorm.io/gorm" + +type DashboardDosbingTransportConfig struct { + DBWrite *gorm.DB + DBRead *gorm.DB +} diff --git a/src/module/dashboard_dosbing/entity/dashboard_dosbing.go b/src/module/dashboard_dosbing/entity/dashboard_dosbing.go new file mode 100644 index 0000000000000000000000000000000000000000..ee728754438d9b0952247cfd873b4719b822133b --- /dev/null +++ b/src/module/dashboard_dosbing/entity/dashboard_dosbing.go @@ -0,0 +1,20 @@ +package entity + +type JumlahMahasiswa struct { + MahasiswaIF int `json:"mahasiswa_if"` + MahasiswaSTI int `json:"mahasiswa_sti"` +} + +type StatusBimbinganMahasiswa struct { + Lancar int `json:"lancar"` + ButuhBimbingan int `json:"butuh_bimbingan"` + Terkendala int `json:"terkendala"` +} + +type MahasiswaBimbingan struct { + IdMahasiswa string `json:"id_mahasiswa"` + Nama string `json:"nama"` + NIM string `json:"nim"` + Topik string `json:"topik"` + Status string `json:"status"` +} diff --git a/src/module/dashboard_dosbing/internal/repository/dashboard_dosbing.go b/src/module/dashboard_dosbing/internal/repository/dashboard_dosbing.go new file mode 100644 index 0000000000000000000000000000000000000000..a035311b8959b854cdfe03c0fc8c90eb51afef0e --- /dev/null +++ b/src/module/dashboard_dosbing/internal/repository/dashboard_dosbing.go @@ -0,0 +1,93 @@ +package repository + +import ( + "errors" + + "gitlab.informatika.org/k-01-11/graduit-be/src/models" + "gitlab.informatika.org/k-01-11/graduit-be/src/module/dashboard_dosbing/entity" + "gorm.io/gorm" +) + +type DashboardDosbingRepo struct { + DBWrite *gorm.DB + DBRead *gorm.DB +} + +func NewDashboardDosbingRepository(dbWrite *gorm.DB, dbRead *gorm.DB) *DashboardDosbingRepo { + return &DashboardDosbingRepo{ + DBWrite: dbWrite, + DBRead: dbRead, + } +} + +func (repo *DashboardDosbingRepo) GetMahasiswaByDosenId(idDosen string, offset, size int) (output []entity.MahasiswaBimbingan, err error) { + var mahasiswaBimbingan []entity.MahasiswaBimbingan + + var dosen models.Dosen + var mahasiswa []models.Mahasiswa + var topik models.Topik + var pendaftaran models.Pendaftaran + + result := repo.DBRead.Where("id_dosen = ?", idDosen).First(&dosen) + if result.Error != nil { + return nil, errors.New("dosen tidak ditemukan") + } + + result = repo.DBRead.Limit(size).Offset(offset).Where("id_dosen = ?", dosen.IdDosen).Find(&mahasiswa) + if result.Error != nil { + return nil, result.Error + } + + for _, mhs := range mahasiswa { + + repo.DBRead.Where("status = TRUE").First(&pendaftaran) + repo.DBRead.Where("id = ?", pendaftaran.IdTopik).First(&topik) + + bimbingan := entity.MahasiswaBimbingan{ + IdMahasiswa: mhs.IdMahasiswa, + Nama: mhs.Name, + NIM: mhs.NIM, + Topik: topik.Judul, + // TODO : KONEKIN KE STATUS + Status: "LANCAR", + } + + mahasiswaBimbingan = append(mahasiswaBimbingan, bimbingan) + } + + return mahasiswaBimbingan, nil + +} + +func (repo *DashboardDosbingRepo) GetAmountMahasiswaByDosenId(idDosen string) (output []entity.JumlahMahasiswa, err error) { + var jumlahMahasiswa entity.JumlahMahasiswa + + var dosen models.Dosen + var mahasiswa []models.Mahasiswa + + result := repo.DBRead.Where("id_dosen = ?", idDosen).First(&dosen) + if result.Error != nil { + return nil, errors.New("dosen tidak ditemukan") + } + + // Mahasiswa IF + result = repo.DBRead.Where("id_dosen = ? AND NIM LIKE ?", dosen.IdDosen, "135%").Find(&mahasiswa) + if result.Error != nil { + jumlahMahasiswa.MahasiswaIF = 0 + } + jumlahMahasiswa.MahasiswaIF = int(result.RowsAffected) + + // Mahasiswa STI + result = repo.DBRead.Where("id_dosen = ? AND NIM LIKE ?", dosen.IdDosen, "182%").Find(&mahasiswa) + if result.Error != nil { + jumlahMahasiswa.MahasiswaSTI = 0 + } + jumlahMahasiswa.MahasiswaSTI = int(result.RowsAffected) + + return []entity.JumlahMahasiswa{jumlahMahasiswa}, nil + +} + +func (repo *DashboardDosbingRepo) GetAmountStatusBimbinganMahasiswaByDosenId(idDosen string) (output []entity.StatusBimbinganMahasiswa, err error) { + return nil, errors.New("Not implemented") +} diff --git a/src/module/dashboard_dosbing/internal/usecase/dashboard_dosbing.go b/src/module/dashboard_dosbing/internal/usecase/dashboard_dosbing.go new file mode 100644 index 0000000000000000000000000000000000000000..40296971c81582b8ffc2edb6368ab20a84b04a57 --- /dev/null +++ b/src/module/dashboard_dosbing/internal/usecase/dashboard_dosbing.go @@ -0,0 +1,49 @@ +package usecase + +import "gitlab.informatika.org/k-01-11/graduit-be/src/module/dashboard_dosbing/entity" + +type DashboardDosbingUseCase interface { + GetMahasiswaByDosenId(idDosen string, offset, size int) (output []entity.MahasiswaBimbingan, err error) + GetAmountMahasiswaByDosenId(idDosen string) (output []entity.JumlahMahasiswa, err error) + GetAmountStatusBimbinganMahasiswaByDosenId(idDosen string) (output []entity.StatusBimbinganMahasiswa, err error) +} + +type DashboardDosbingUc struct { + dashboardDosbingRepo DashboardDosbingRepository +} + +func NewDashboardDosbingUsecase(dashboardDosbingRepo DashboardDosbingRepository) *DashboardDosbingUc { + return &DashboardDosbingUc{ + dashboardDosbingRepo: dashboardDosbingRepo, + } +} + +func (uc *DashboardDosbingUc) GetMahasiswaByDosenId(idDosen string, offset, size int) (output []entity.MahasiswaBimbingan, err error) { + listMahasiswa, err := uc.dashboardDosbingRepo.GetMahasiswaByDosenId(idDosen, offset, size) + + if err != nil { + return listMahasiswa, err + } + + return listMahasiswa, nil +} + +func (uc *DashboardDosbingUc) GetAmountMahasiswaByDosenId(idDosen string) (output []entity.JumlahMahasiswa, err error) { + listMahasiswa, err := uc.dashboardDosbingRepo.GetAmountMahasiswaByDosenId(idDosen) + + if err != nil { + return listMahasiswa, err + } + + return listMahasiswa, nil +} + +func (uc *DashboardDosbingUc) GetAmountStatusBimbinganMahasiswaByDosenId(idDosen string) (output []entity.StatusBimbinganMahasiswa, err error) { + listMahasiswa, err := uc.dashboardDosbingRepo.GetAmountStatusBimbinganMahasiswaByDosenId(idDosen) + + if err != nil { + return listMahasiswa, err + } + + return listMahasiswa, nil +} diff --git a/src/module/dashboard_dosbing/internal/usecase/repository.go b/src/module/dashboard_dosbing/internal/usecase/repository.go new file mode 100644 index 0000000000000000000000000000000000000000..0d7f821934403bc375cc92a598c3b0a4a8f1af03 --- /dev/null +++ b/src/module/dashboard_dosbing/internal/usecase/repository.go @@ -0,0 +1,9 @@ +package usecase + +import "gitlab.informatika.org/k-01-11/graduit-be/src/module/dashboard_dosbing/entity" + +type DashboardDosbingRepository interface { + GetMahasiswaByDosenId(idDosen string, offset, size int) (output []entity.MahasiswaBimbingan, err error) + GetAmountMahasiswaByDosenId(idDosen string) (output []entity.JumlahMahasiswa, err error) + GetAmountStatusBimbinganMahasiswaByDosenId(idDosen string) (output []entity.StatusBimbinganMahasiswa, err error) +} diff --git a/src/module/dashboard_dosbing/transport/admin_handler.go b/src/module/dashboard_dosbing/transport/admin_handler.go new file mode 100644 index 0000000000000000000000000000000000000000..0786eedfd05918765c07ed3935e088128a458a8d --- /dev/null +++ b/src/module/dashboard_dosbing/transport/admin_handler.go @@ -0,0 +1,93 @@ +package transport + +import ( + "net/http" + "strconv" + + "github.com/labstack/echo" + "gitlab.informatika.org/k-01-11/graduit-be/src/module/dashboard_dosbing/config" + "gitlab.informatika.org/k-01-11/graduit-be/src/module/dashboard_dosbing/internal/repository" + "gitlab.informatika.org/k-01-11/graduit-be/src/module/dashboard_dosbing/internal/usecase" + "gitlab.informatika.org/k-01-11/graduit-be/src/utils" +) + +type AdminDashboardDosbingHandler struct { + dashboardDosbingUseCase usecase.DashboardDosbingUseCase +} + +func NewAdminDashboardDosbingHandler(cfg config.DashboardDosbingTransportConfig) *AdminDashboardDosbingHandler { + dashboardDosbingRepository := repository.NewDashboardDosbingRepository(cfg.DBWrite, cfg.DBRead) + dashboardDosbingUsecase := usecase.NewDashboardDosbingUsecase(dashboardDosbingRepository) + + return &AdminDashboardDosbingHandler{ + dashboardDosbingUseCase: dashboardDosbingUsecase, + } +} + +func (t *AdminDashboardDosbingHandler) MountAdmin(group *echo.Group) { + group.GET("/dashboard-dosbing", t.GetMahasiswaByDosenId) + group.GET("/dashboard-dosbing/jurusan", t.GetAmountMahasiswaByDosenId) + group.GET("/dashboard-dosbing/bimbingan", t.GetAmountStatusBimbinganMahasiswaByDosenId) +} + +func (t *AdminDashboardDosbingHandler) GetMahasiswaByDosenId(c echo.Context) error { + idDosen := c.QueryParam("id_dosen") + sizeStr := c.QueryParam("limit") + offsetStr := c.QueryParam("offset") + + if idDosen == "" { + return c.JSON(http.StatusInternalServerError, utils.ResponseDetailOutput(false, http.StatusInternalServerError, "insert id_dosen", nil)) + } + + size, err := strconv.Atoi(sizeStr) + if err != nil { + // Handle error, maybe return an error response + size = 10 + } + + offset, err := strconv.Atoi(offsetStr) + if err != nil { + // Handle error, maybe return an error response + offset = 0 + } + + listMahasiswa, err := t.dashboardDosbingUseCase.GetMahasiswaByDosenId(idDosen, offset, size) + if err != nil { + return c.JSON(http.StatusBadRequest, utils.ResponseDetailOutput(false, http.StatusBadRequest, err.Error(), nil)) + } + + return c.JSON(http.StatusOK, utils.ResponseDetailOutput(true, http.StatusOK, "List mahasiswa successfully retreived", listMahasiswa)) + +} + +func (t *AdminDashboardDosbingHandler) GetAmountMahasiswaByDosenId(c echo.Context) error { + idDosen := c.QueryParam("id_dosen") + + if idDosen == "" { + return c.JSON(http.StatusInternalServerError, utils.ResponseDetailOutput(false, http.StatusInternalServerError, "insert id_dosen", nil)) + } + + listMahasiswa, err := t.dashboardDosbingUseCase.GetAmountMahasiswaByDosenId(idDosen) + if err != nil { + return c.JSON(http.StatusBadRequest, utils.ResponseDetailOutput(false, http.StatusBadRequest, err.Error(), nil)) + } + + return c.JSON(http.StatusOK, utils.ResponseDetailOutput(true, http.StatusOK, "List mahasiswa successfully retreived", listMahasiswa[0])) + +} + +func (t *AdminDashboardDosbingHandler) GetAmountStatusBimbinganMahasiswaByDosenId(c echo.Context) error { + idDosen := c.QueryParam("id_dosen") + + if idDosen == "" { + return c.JSON(http.StatusInternalServerError, utils.ResponseDetailOutput(false, http.StatusInternalServerError, "insert id_dosen", nil)) + } + + listMahasiswa, err := t.dashboardDosbingUseCase.GetAmountStatusBimbinganMahasiswaByDosenId(idDosen) + if err != nil { + return c.JSON(http.StatusBadRequest, utils.ResponseDetailOutput(false, http.StatusBadRequest, err.Error(), nil)) + } + + return c.JSON(http.StatusOK, utils.ResponseDetailOutput(true, http.StatusOK, "List mahasiswa successfully retreived", listMahasiswa[0])) + +}