diff --git a/src/database/Database.go b/src/database/Database.go index 7f52689ac43cfe81b620b77c121bc78d764e572b..ee28160143f2a99b2a1c6b2dcbfcf2ca9c218835 100644 --- a/src/database/Database.go +++ b/src/database/Database.go @@ -51,6 +51,7 @@ func initialize() { dbInstance.AutoMigrate(&models.PendaftaranTA{}) dbInstance.AutoMigrate(&models.Ruangan{}) dbInstance.AutoMigrate(&models.PendaftaranSidSem{}) + dbInstance.AutoMigrate(&models.PeriodPendaftaran{}) dbInstance.AutoMigrate(&models.PengujiSidsem{}) dbInstance.AutoMigrate(&models.DosenBimbingan{}) dbInstance.AutoMigrate(&models.UsulanJudul{}) diff --git a/src/handler/handler.go b/src/handler/handler.go index 66939c2f2fd73055acca2584a75504c4306a5623..d9f5c953353ca9d8806914d9b8b1341f08017a6e 100644 --- a/src/handler/handler.go +++ b/src/handler/handler.go @@ -20,6 +20,8 @@ import ( pendaftaranSidSemTransport "gitlab.informatika.org/k-01-11/graduit-be/src/module/pendaftaran_sidsem/transport" periodePendaftaranConfig "gitlab.informatika.org/k-01-11/graduit-be/src/module/period_pendaftaran/config" periodePendaftaranTransport "gitlab.informatika.org/k-01-11/graduit-be/src/module/period_pendaftaran/transport" + ruanganConfig "gitlab.informatika.org/k-01-11/graduit-be/src/module/ruangan/config" + ruanganTransport "gitlab.informatika.org/k-01-11/graduit-be/src/module/ruangan/transport" schedulingConfig "gitlab.informatika.org/k-01-11/graduit-be/src/module/scheduling/config" schedulingTransport "gitlab.informatika.org/k-01-11/graduit-be/src/module/scheduling/transport" systemLogConfig "gitlab.informatika.org/k-01-11/graduit-be/src/module/system_log/config" @@ -29,6 +31,7 @@ import ( ) type Service struct { + AdminRuanganHandler *ruanganTransport.AdminRuanganHandler InternalSystemLogHandler *systemLogTransport.InternalSystemLogHandler AdminSytemLogHandler *systemLogTransport.AdminSystemLogHandler AdminBimbinganLogHandler *bimbinganLogTransport.AdminBimbinganLogHandler @@ -45,7 +48,7 @@ type Service struct { DosbingBimbinganLogHandler *bimbinganLogTransport.DosbingimbinganLogHandler TIMTASchedulingHandler *schedulingTransport.TIMTASchedulingHandler MahasiswaPendaftaranSidSemHandler *pendaftaranSidSemTransport.MahasiswaPendaftaranSidSemHandler - TIMTAPendaftaranSidSemHandler *pendaftaranSidSemTransport.TIMTAPendaftaranSidSemHandler + TIMTAPendaftaranSidSemHandler *pendaftaranSidSemTransport.TIMTAPendaftaranSidSemHandler } func MakeHandler() *Service { @@ -106,7 +109,7 @@ func MakeHandler() *Service { }) TIMTAPendaftaranSidSemHandler := pendaftaranSidSemTransport.NewTIMTAPendaftaranSidSemHandler(pendaftaranSidSemConfig.PendaftaranSidSemTransportConfig{ - DBRead: dbRead, + DBRead: dbRead, DBWrite: dbWrite, }) @@ -119,7 +122,10 @@ func MakeHandler() *Service { DBWrite: dbWrite, DBRead: dbRead, }) - + AdminRuanganHandler := ruanganTransport.NewAdminRuanganHandler(ruanganConfig.RuanganTransportConfig{ + DBWrite: dbWrite, + DBRead: dbRead, + }) MahasiswaPendaftaranSidSemHandler := pendaftaranSidSemTransport.NewMahasiswaPendaftaranSidSemHandler(pendaftaranSidSemConfig.PendaftaranSidSemTransportConfig{ DBWrite: dbWrite, DBRead: dbRead, @@ -142,6 +148,7 @@ func MakeHandler() *Service { AdminDashboardTimTugasHandler: AdminDashboardTimTugasHandler, TIMTASchedulingHandler: TIMTASchedulingHandlerHandler, MahasiswaPendaftaranSidSemHandler: MahasiswaPendaftaranSidSemHandler, - TIMTAPendaftaranSidSemHandler: TIMTAPendaftaranSidSemHandler, + TIMTAPendaftaranSidSemHandler: TIMTAPendaftaranSidSemHandler, + AdminRuanganHandler: AdminRuanganHandler, } } diff --git a/src/handler/server.go b/src/handler/server.go index 53b2d86baa7459f5ab88c8dafd5d81285ea878db..dd64b3778d9061e73d91305b2fabbf22256790fb 100644 --- a/src/handler/server.go +++ b/src/handler/server.go @@ -46,6 +46,7 @@ func (s *Service) InitializeRoutes() *echo.Echo { s.AdminPendaftaranHandler.MountAdmin(adminGroup) s.AdminPeriodePendaftaranHandler.MountAdmin(adminGroup) s.AdminDashboardTimTugasHandler.MountAdmin(adminGroup) + s.AdminRuanganHandler.MountAdmin(adminGroup) mahasiswaGroup := e.Group("api/mahasiswa") mahasiswaGroup.Use(middleware.Validator("S1_MAHASISWA")) diff --git a/src/module/ruangan/config/common.go b/src/module/ruangan/config/common.go new file mode 100644 index 0000000000000000000000000000000000000000..6b84f4b3d6b233cb8d0c947862be0c2a903812e3 --- /dev/null +++ b/src/module/ruangan/config/common.go @@ -0,0 +1,8 @@ +package config + +import "gorm.io/gorm" + +type RuanganTransportConfig struct { + DBWrite *gorm.DB + DBRead *gorm.DB +} diff --git a/src/module/ruangan/entity/ruangan.go b/src/module/ruangan/entity/ruangan.go new file mode 100644 index 0000000000000000000000000000000000000000..7aa7499f818f37d902b57a59dc22c81274dc47d7 --- /dev/null +++ b/src/module/ruangan/entity/ruangan.go @@ -0,0 +1,11 @@ +package entity + +type Ruangan struct { + ID string `gorm:"type:uuid;primaryKey;default:gen_random_uuid()"` + Nama string `gorm:"type:text"` +} + +type ParamValues struct { + Limit int + Offset int +} diff --git a/src/module/ruangan/internal/repository/ruangan.go b/src/module/ruangan/internal/repository/ruangan.go new file mode 100644 index 0000000000000000000000000000000000000000..e7d7263e74f0783a7d6d7650f774946f613f82f0 --- /dev/null +++ b/src/module/ruangan/internal/repository/ruangan.go @@ -0,0 +1,56 @@ +package repository + +import ( + "github.com/google/uuid" + "gitlab.informatika.org/k-01-11/graduit-be/src/module/ruangan/entity" + "gorm.io/gorm" +) + +type RuanganRepo struct { + DBWrite *gorm.DB + DBRead *gorm.DB +} + +func NewRuanganRepository(dbWrite *gorm.DB, dbRead *gorm.DB) *RuanganRepo { + return &RuanganRepo{ + DBWrite: dbWrite, + DBRead: dbRead, + } +} + +func (repo *RuanganRepo) NewRuangan(ruangan entity.Ruangan) (output entity.Ruangan, err error) { + ruangan.ID = uuid.New().String() + + result := repo.DBWrite.Create(&ruangan) + if result.Error != nil { + return entity.Ruangan{}, result.Error + } + return ruangan, nil +} + +func (repo *RuanganRepo) GetRuangan(limit int, offset int) (output []entity.Ruangan, err error) { + var ruangan []entity.Ruangan + result := repo.DBRead.Limit(limit).Offset(offset).Find(&ruangan) + if result.Error != nil { + return nil, err + } + return ruangan, nil +} + +func (repo *RuanganRepo) GetRuanganById(id string) (output entity.Ruangan, err error) { + var ruangan entity.Ruangan + result := repo.DBRead.Where("id = ?", id).Find(&ruangan) + if result.Error != nil { + return entity.Ruangan{}, err + } + return ruangan, nil +} + +func (repo *RuanganRepo) GetAllRuangan() (output []entity.Ruangan, err error) { + var ruangan []entity.Ruangan + result := repo.DBRead.Find(&ruangan) + if result.Error != nil { + return nil, err + } + return ruangan, nil +} diff --git a/src/module/ruangan/internal/usecase/repository.go b/src/module/ruangan/internal/usecase/repository.go new file mode 100644 index 0000000000000000000000000000000000000000..e69045c33a7998475319f5f6392ec91a5e8eac56 --- /dev/null +++ b/src/module/ruangan/internal/usecase/repository.go @@ -0,0 +1,10 @@ +package usecase + +import "gitlab.informatika.org/k-01-11/graduit-be/src/module/ruangan/entity" + +type RuanganRepository interface { + NewRuangan(ruangan entity.Ruangan) (output entity.Ruangan, err error) + GetRuangan(limit int, offset int) (output []entity.Ruangan, err error) + GetRuanganById(id string) (output entity.Ruangan, err error) + GetAllRuangan() (output []entity.Ruangan, err error) +} diff --git a/src/module/ruangan/internal/usecase/ruangan.go b/src/module/ruangan/internal/usecase/ruangan.go new file mode 100644 index 0000000000000000000000000000000000000000..8f64ec6249504452c20cfa605bd93afe1e7a1ca6 --- /dev/null +++ b/src/module/ruangan/internal/usecase/ruangan.go @@ -0,0 +1,46 @@ +package usecase + +import ( + "gitlab.informatika.org/k-01-11/graduit-be/src/module/ruangan/entity" + "gitlab.informatika.org/k-01-11/graduit-be/src/utils" +) + +type RuanganUsecase interface { + AddRuangan(ruangan entity.Ruangan) (entity.Ruangan, error) + GetRuangan(param utils.LimitOffset) ([]entity.Ruangan, error) + GetRuanganById(id string) (entity.Ruangan, error) + GetAllRuangan() ([]entity.Ruangan, error) +} + +type RuanganUc struct { + ruanganRepo RuanganRepository +} + +func NewRuanganUseCase(ruanganRepo RuanganRepository) *RuanganUc { + return &RuanganUc{ + ruanganRepo: ruanganRepo, + } +} + +func (uc *RuanganUc) AddRuangan(ruangan entity.Ruangan) (entity.Ruangan, error) { + newRuangan, err := uc.ruanganRepo.NewRuangan(ruangan) + + if err != nil { + return newRuangan, err + } + + return newRuangan, nil + +} + +func (uc *RuanganUc) GetRuangan(param utils.LimitOffset) ([]entity.Ruangan, error) { + return uc.ruanganRepo.GetRuangan(param.Limit, param.Offset) +} + +func (uc *RuanganUc) GetRuanganById(id string) (entity.Ruangan, error) { + return uc.ruanganRepo.GetRuanganById(id) +} + +func (uc *RuanganUc) GetAllRuangan() ([]entity.Ruangan, error) { + return uc.ruanganRepo.GetAllRuangan() +} diff --git a/src/module/ruangan/transport/admin_handler.go b/src/module/ruangan/transport/admin_handler.go new file mode 100644 index 0000000000000000000000000000000000000000..25c4d9fc0719b6f6e58cd181082e19ee9e4a9d83 --- /dev/null +++ b/src/module/ruangan/transport/admin_handler.go @@ -0,0 +1,117 @@ +package transport + +import ( + "net/http" + + "github.com/labstack/echo/v4" + "gitlab.informatika.org/k-01-11/graduit-be/src/module/ruangan/config" + "gitlab.informatika.org/k-01-11/graduit-be/src/module/ruangan/entity" + "gitlab.informatika.org/k-01-11/graduit-be/src/module/ruangan/internal/repository" + "gitlab.informatika.org/k-01-11/graduit-be/src/module/ruangan/internal/usecase" + "gitlab.informatika.org/k-01-11/graduit-be/src/utils" +) + +type AdminRuanganHandler struct { + ruanganUsecase usecase.RuanganUsecase +} + +func NewAdminRuanganHandler(cfg config.RuanganTransportConfig) *AdminRuanganHandler { + ruanganRepository := repository.NewRuanganRepository(cfg.DBWrite, cfg.DBRead) + ruanganUsecase := usecase.NewRuanganUseCase(ruanganRepository) + + return &AdminRuanganHandler{ + ruanganUsecase: ruanganUsecase, + } + +} + +func (t *AdminRuanganHandler) MountAdmin(group *echo.Group) { + group.GET("/ruangan", t.GetRuangan) + group.GET("/ruangan-id", t.GetRuanganById) + group.GET("/ruangan-all", t.GetAllRuangan) + group.POST("/ruangan", t.AddRuangan) +} + +// AddRuangan adds a new entity for Ruangan +// @Summary Add new Ruangan entity +// @Description Adds a new entity for ruangan +// @Tags Ruang +// @Accept json +// @Produce json +// @Param batch body entity.Ruangan true "Ruangan object" +// @Success 200 {object} entity.Ruangan "Ruangan successfully added" +// @Router /api/admin/ruangan [post] +func (t *AdminRuanganHandler) AddRuangan(c echo.Context) error { + request := new(entity.Ruangan) + if err := c.Bind(&request); err != nil { + return c.JSON(http.StatusBadRequest, utils.ResponseDetailOutput(false, http.StatusBadRequest, err.Error(), nil)) + } + + ruangan, err := t.ruanganUsecase.AddRuangan(*request) + 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, "Ruangan successfully added", ruangan)) +} + +// GetRuangan retrieves a list of ruangan in table ruangan +// @Summary Retrieve list of ruangan +// @Description Retrieves a list of ruangan in table ruangan with specific offset and limit +// @Tags Ruang +// @Accept json +// @Produce json +// @Param limit query int false "Limit number of ruangan per page" +// @Param offset query int false "Offset for pagination" +// @Success 200 {object} entity.Ruangan "Ruangan successfully added" +// @Router /api/admin/ruangan [get] +func (t *AdminRuanganHandler) GetRuangan(c echo.Context) error { + param, err := utils.GetLimitOffset(c.QueryParams()) + if err != nil { + return c.JSON(http.StatusInternalServerError, utils.ResponseDetailOutput(false, http.StatusInternalServerError, err.Error(), nil)) + } + + ruangan, err := t.ruanganUsecase.GetRuangan(param) + 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, "Ruangan successfully retreived", ruangan)) +} + +// GetRuangan retrieves a ruangan entity with specific ID +// @Summary Retrieve list of ruangan +// @Description Retrieves a ruangan entity in table ruangan with specific ID +// @Tags Ruang +// @Accept json +// @Produce json +// @Param id query string true "ID of Ruangan" +// @Success 200 {object} entity.Ruangan "Ruangan successfully added" +// @Router /api/admin/ruangan-id [get] +func (t *AdminRuanganHandler) GetRuanganById(c echo.Context) error { + id := c.QueryParam("id") + + ruangan, err := t.ruanganUsecase.GetRuanganById(id) + 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, "Ruangan successfully retreived", ruangan)) +} + +// GetRuangan retrieves a list of ruangan in table ruangan +// @Summary Retrieve list of ruangan +// @Description Retrieves a list of ruangan in table ruangan +// @Tags Ruang +// @Accept json +// @Produce json +// @Success 200 {object} entity.Ruangan "Ruangan successfully added" +// @Router /api/admin/ruangan-all [get] +func (t *AdminRuanganHandler) GetAllRuangan(c echo.Context) error { + ruangan, err := t.ruanganUsecase.GetAllRuangan() + 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, "Ruangan successfully retreived", ruangan)) +}