feat(BE-117): implement CRUD endpoints for project

This commit is contained in:
aguhh18
2025-10-20 11:25:42 +07:00
parent 5c3787886b
commit 7b99b39529
14 changed files with 233 additions and 119 deletions
@@ -1,6 +1,6 @@
CREATE TABLE IF NOT EXISTS project_chickins ( CREATE TABLE IF NOT EXISTS project_chickins (
id BIGSERIAL PRIMARY KEY, id BIGSERIAL PRIMARY KEY,
project_floc_kandang_id BIGINT NOT NULL, project_flock_kandang_id BIGINT NOT NULL,
chick_in_date DATE NOT NULL, chick_in_date DATE NOT NULL,
quantity NUMERIC(15, 3) NOT NULL, quantity NUMERIC(15, 3) NOT NULL,
note TEXT, note TEXT,
@@ -15,8 +15,8 @@ DO $$
BEGIN BEGIN
IF EXISTS (SELECT 1 FROM pg_tables WHERE tablename = 'project_flock_kandangs') THEN IF EXISTS (SELECT 1 FROM pg_tables WHERE tablename = 'project_flock_kandangs') THEN
ALTER TABLE project_chickins ALTER TABLE project_chickins
ADD CONSTRAINT fk_project_floc_kandang_id ADD CONSTRAINT fk_project_flock_kandang_id
FOREIGN KEY (project_floc_kandang_id) FOREIGN KEY (project_flock_kandang_id)
REFERENCES project_flock_kandangs(id) REFERENCES project_flock_kandangs(id)
ON DELETE RESTRICT ON UPDATE CASCADE; ON DELETE RESTRICT ON UPDATE CASCADE;
END IF; END IF;
@@ -31,6 +31,6 @@ BEGIN
END $$; END $$;
-- INDEXES -- INDEXES
CREATE INDEX IF NOT EXISTS idx_project_chickins_project_floc_kandang_id ON project_chickins (project_floc_kandang_id); CREATE INDEX IF NOT EXISTS idx_project_chickins_project_flock_kandang_id ON project_chickins (project_flock_kandang_id);
CREATE INDEX IF NOT EXISTS idx_project_chickins_created_by ON project_chickins (created_by); CREATE INDEX IF NOT EXISTS idx_project_chickins_created_by ON project_chickins (created_by);
@@ -0,0 +1 @@
DROP TABLE IF EXISTS project_flock_populations;
@@ -0,0 +1,36 @@
CREATE TABLE IF NOT EXISTS project_flock_populations (
id BIGSERIAL PRIMARY KEY,
project_flock_kandang_id BIGINT NOT NULL,
initial_quantity NUMERIC(15, 3) NOT NULL,
current_quantity NUMERIC(15, 3) NOT NULL,
reserved_quantity NUMERIC(15, 3),
created_by BIGINT NOT NULL,
created_at TIMESTAMPTZ DEFAULT now(),
updated_at TIMESTAMPTZ DEFAULT now(),
deleted_at TIMESTAMPTZ
);
-- FOREIGN KEYS (dijalankan setelah semua tabel parent ada)
DO $$
BEGIN
IF EXISTS (SELECT 1 FROM pg_tables WHERE tablename = 'project_flock_kandangs') THEN
ALTER TABLE project_flock_populations
ADD CONSTRAINT fk_project_flock_kandang_id
FOREIGN KEY (project_flock_kandang_id)
REFERENCES project_flock_kandangs(id)
ON DELETE RESTRICT ON UPDATE CASCADE;
END IF;
IF EXISTS (SELECT 1 FROM pg_tables WHERE tablename = 'users') THEN
ALTER TABLE project_flock_populations
ADD CONSTRAINT fk_created_by
FOREIGN KEY (created_by)
REFERENCES users(id)
ON DELETE RESTRICT ON UPDATE CASCADE;
END IF;
END $$;
-- INDEXES
CREATE INDEX IF NOT EXISTS idx_project_flock_populations_project_flock_kandang_id ON project_flock_populations (project_flock_kandang_id);
CREATE INDEX IF NOT EXISTS idx_project_flock_populations_created_by ON project_flock_populations (created_by);
+2 -2
View File
@@ -10,7 +10,7 @@ const ()
type ProjectChickin struct { type ProjectChickin struct {
Id uint `gorm:"primaryKey"` Id uint `gorm:"primaryKey"`
ProjectFlocKandangId uint `gorm:"not null"` ProjectFlockKandangId uint `gorm:"not null"`
ChickInDate time.Time `gorm:"not null"` ChickInDate time.Time `gorm:"not null"`
Quantity float64 `gorm:"not null"` Quantity float64 `gorm:"not null"`
Note string `gorm:"type:text"` Note string `gorm:"type:text"`
@@ -19,6 +19,6 @@ type ProjectChickin struct {
UpdatedAt time.Time `gorm:"autoUpdateTime"` UpdatedAt time.Time `gorm:"autoUpdateTime"`
DeletedAt gorm.DeletedAt `gorm:"index" json:"-"` DeletedAt gorm.DeletedAt `gorm:"index" json:"-"`
ProjectFlockKandang ProjectFlockKandang `gorm:"foreignKey:ProjectFlocKandangId;references:Id"` ProjectFlockKandang ProjectFlockKandang `gorm:"foreignKey:ProjectFlockKandangId;references:Id"`
CreatedUser User `gorm:"foreignKey:CreatedBy;references:Id"` CreatedUser User `gorm:"foreignKey:CreatedBy;references:Id"`
} }
@@ -0,0 +1,22 @@
package entities
import (
"time"
"gorm.io/gorm"
)
type ProjectFlockPopulation struct {
Id uint `gorm:"primaryKey"`
ProjectFlockKandangId uint `gorm:"not null"`
InitialQuantity float64 `gorm:"type:numeric(15,3);not null"`
CurrentQuantity float64 `gorm:"type:numeric(15,3);not null"`
ReservedQuantity float64 `gorm:"type:numeric(15,3)"`
CreatedBy uint `gorm:"not null"`
CreatedAt time.Time `gorm:"autoCreateTime"`
UpdatedAt time.Time `gorm:"autoUpdateTime"`
DeletedAt gorm.DeletedAt `gorm:"index"`
ProjectFlockKandang *ProjectFlockKandang `gorm:"foreignKey:ProjectFlockKandangId;references:Id"`
CreatedUser *User `gorm:"foreignKey:CreatedBy;references:Id"`
}
@@ -23,6 +23,11 @@ type WarehouseSimpleDTO struct {
Name string `json:"name"` Name string `json:"name"`
} }
type ProductSimpleDTO struct {
Id uint `json:"id"`
Name string `json:"name"`
}
type AreaDTO struct { type AreaDTO struct {
Id uint `json:"id"` Id uint `json:"id"`
Name string `json:"name"` Name string `json:"name"`
@@ -33,6 +38,11 @@ type LocationDTO struct {
Name string `json:"name"` Name string `json:"name"`
} }
type SuplierSimpleDTO struct {
Id uint `json:"id"`
Name string `json:"name"`
}
type WarehouseDetailDTO struct { type WarehouseDetailDTO struct {
Id uint `json:"id"` Id uint `json:"id"`
Name string `json:"name"` Name string `json:"name"`
@@ -58,16 +68,14 @@ type TransferDetailDTO struct {
// Detail produk // Detail produk
type TransferDetailItemDTO struct { type TransferDetailItemDTO struct {
Id uint64 `json:"id"` Id uint64 `json:"id"`
ProductId uint64 `json:"product_id"` Proudct ProductSimpleDTO `json:"product"`
Quantity float64 `json:"quantity"` Quantity float64 `json:"quantity"`
BeforeQuantity float64 `json:"before_quantity"`
AfterQuantity float64 `json:"after_quantity"`
} }
// Delivery ekspedisi // Delivery ekspedisi
type TransferDeliveryDTO struct { type TransferDeliveryDTO struct {
Id uint64 `json:"id"` Id uint64 `json:"id"`
SupplierId uint64 `json:"supplier_id"` Suplier SuplierSimpleDTO `json:"suplier"`
VehiclePlate string `json:"vehicle_plate"` VehiclePlate string `json:"vehicle_plate"`
DriverName string `json:"driver_name"` DriverName string `json:"driver_name"`
DocumentNumber string `json:"document_number"` DocumentNumber string `json:"document_number"`
@@ -147,7 +155,10 @@ func ToTransferListDTO(e entity.StockTransfer) TransferListDTO {
for _, d := range e.Details { for _, d := range e.Details {
details = append(details, TransferDetailItemDTO{ details = append(details, TransferDetailItemDTO{
Id: d.Id, Id: d.Id,
ProductId: d.ProductId, Proudct: ProductSimpleDTO{
Id: d.Product.Id,
Name: d.Product.Name,
},
Quantity: d.Quantity, Quantity: d.Quantity,
}) })
} }
@@ -165,7 +176,10 @@ func ToTransferListDTO(e entity.StockTransfer) TransferListDTO {
} }
deliveries = append(deliveries, TransferDeliveryDTO{ deliveries = append(deliveries, TransferDeliveryDTO{
Id: del.Id, Id: del.Id,
SupplierId: del.SupplierId, Suplier: SuplierSimpleDTO{
Id: del.Supplier.Id,
Name: del.Supplier.Name,
},
VehiclePlate: del.VehiclePlate, VehiclePlate: del.VehiclePlate,
DriverName: del.DriverName, DriverName: del.DriverName,
DocumentNumber: del.DocumentNumber, DocumentNumber: del.DocumentNumber,
@@ -199,7 +213,10 @@ func ToTransferDetailDTO(e entity.StockTransfer) TransferDetailDTO {
for _, d := range e.Details { for _, d := range e.Details {
details = append(details, TransferDetailItemDTO{ details = append(details, TransferDetailItemDTO{
Id: d.Id, Id: d.Id,
ProductId: d.ProductId, Proudct: ProductSimpleDTO{
Id: d.Product.Id,
Name: d.Product.Name,
},
Quantity: d.Quantity, Quantity: d.Quantity,
}) })
} }
@@ -208,7 +225,10 @@ func ToTransferDetailDTO(e entity.StockTransfer) TransferDetailDTO {
for _, del := range e.Deliveries { for _, del := range e.Deliveries {
deliveries = append(deliveries, TransferDeliveryDTO{ deliveries = append(deliveries, TransferDeliveryDTO{
Id: del.Id, Id: del.Id,
SupplierId: del.SupplierId, Suplier: SuplierSimpleDTO{
Id: del.Supplier.Id,
Name: del.Supplier.Name,
},
VehiclePlate: del.VehiclePlate, VehiclePlate: del.VehiclePlate,
DriverName: del.DriverName, DriverName: del.DriverName,
DocumentNumber: del.DocumentNumber, DocumentNumber: del.DocumentNumber,
@@ -60,7 +60,9 @@ func (s transferService) withRelations(db *gorm.DB) *gorm.DB {
Preload("ToWarehouse.Location"). Preload("ToWarehouse.Location").
Preload("ToWarehouse.Area"). Preload("ToWarehouse.Area").
Preload("Details"). Preload("Details").
Preload("Deliveries.Items") Preload("Details.Product").
Preload("Deliveries.Items").
Preload("Deliveries.Supplier")
} }
func (s transferService) GetAll(c *fiber.Ctx, params *validation.Query) ([]entity.StockTransfer, int64, error) { func (s transferService) GetAll(c *fiber.Ctx, params *validation.Query) ([]entity.StockTransfer, int64, error) {
@@ -26,7 +26,7 @@ func (u *ChickinController) GetAll(c *fiber.Ctx) error {
query := &validation.Query{ query := &validation.Query{
Page: c.QueryInt("page", 1), Page: c.QueryInt("page", 1),
Limit: c.QueryInt("limit", 10), Limit: c.QueryInt("limit", 10),
Search: c.Query("search", ""), ProjectFlockKandangId: uint(c.QueryInt("project_flock_kandang_id", 0)),
} }
result, totalResults, err := u.ChickinService.GetAll(c, query) result, totalResults, err := u.ChickinService.GetAll(c, query)
@@ -88,7 +88,7 @@ func (u *ChickinController) CreateOne(c *fiber.Ctx) error {
Code: fiber.StatusCreated, Code: fiber.StatusCreated,
Status: "success", Status: "success",
Message: "Create chickin successfully", Message: "Create chickin successfully",
Data: result, Data: dto.ToChickinListDTO(*result),
}) })
} }
@@ -69,7 +69,7 @@ type ChickinBaseDTO struct {
type ChickinSimpleDTO struct { type ChickinSimpleDTO struct {
Id uint `json:"id"` Id uint `json:"id"`
ProjectFlocKandangId uint `json:"project_floc_kandang_id"` ProjectFlockKandangId uint `json:"project_flock_kandang_id"`
ChickInDate time.Time `json:"chick_in_date"` ChickInDate time.Time `json:"chick_in_date"`
Quantity float64 `json:"quantity"` Quantity float64 `json:"quantity"`
Note string `json:"note"` Note string `json:"note"`
@@ -197,7 +197,7 @@ func ToUserBaseDTO(e entity.User) UserBaseDTO {
func ToChickinBaseDTO(e entity.ProjectChickin) ChickinBaseDTO { func ToChickinBaseDTO(e entity.ProjectChickin) ChickinBaseDTO {
return ChickinBaseDTO{ return ChickinBaseDTO{
Id: e.Id, Id: e.Id,
ProjectFlocKandangId: e.ProjectFlocKandangId, ProjectFlocKandangId: e.ProjectFlockKandangId,
ChickInDate: e.ChickInDate, ChickInDate: e.ChickInDate,
Quantity: e.Quantity, Quantity: e.Quantity,
Note: e.Note, Note: e.Note,
@@ -207,7 +207,7 @@ func ToChickinBaseDTO(e entity.ProjectChickin) ChickinBaseDTO {
func ToChickinSimpleDTO(e entity.ProjectChickin) ChickinSimpleDTO { func ToChickinSimpleDTO(e entity.ProjectChickin) ChickinSimpleDTO {
return ChickinSimpleDTO{ return ChickinSimpleDTO{
Id: e.Id, Id: e.Id,
ProjectFlocKandangId: e.ProjectFlocKandangId, ProjectFlockKandangId: e.ProjectFlockKandangId,
ChickInDate: e.ChickInDate, ChickInDate: e.ChickInDate,
Quantity: e.Quantity, Quantity: e.Quantity,
Note: e.Note, Note: e.Note,
@@ -26,12 +26,13 @@ func (ChickinModule) RegisterRoutes(router fiber.Router, db *gorm.DB, validate *
auditlogrepo := rAuditLog.NewAuditLogRepository(db) auditlogrepo := rAuditLog.NewAuditLogRepository(db)
warehouseRepo := rWarehouse.NewWarehouseRepository(db) warehouseRepo := rWarehouse.NewWarehouseRepository(db)
projectflockkandangrepo := rProjectFlock.NewProjectFlockKandangRepository(db) projectflockkandangrepo := rProjectFlock.NewProjectFlockKandangRepository(db)
projectflockpopulationrepo := rProjectFlock.NewProjectFlockPopulationRepository(db)
projectFlockRepo := rProjectFlock.NewProjectflockRepository(db) projectFlockRepo := rProjectFlock.NewProjectflockRepository(db)
productWarehouseRepo := rProductWarehouse.NewProductWarehouseRepository(db) productWarehouseRepo := rProductWarehouse.NewProductWarehouseRepository(db)
userRepo := rUser.NewUserRepository(db) userRepo := rUser.NewUserRepository(db)
chickinService := sChickin.NewChickinService(chickinRepo, kandangRepo, warehouseRepo, productWarehouseRepo, projectFlockRepo, auditlogrepo, projectflockkandangrepo, validate) chickinService := sChickin.NewChickinService(chickinRepo, kandangRepo, warehouseRepo, productWarehouseRepo, projectFlockRepo, auditlogrepo, projectflockkandangrepo, projectflockpopulationrepo, validate)
userService := sUser.NewUserService(userRepo, validate) userService := sUser.NewUserService(userRepo, validate)
ChickinRoutes(router, userService, chickinService) ChickinRoutes(router, userService, chickinService)
@@ -40,9 +40,10 @@ type chickinService struct {
ProjectFlockRepo rProjectFlock.ProjectflockRepository ProjectFlockRepo rProjectFlock.ProjectflockRepository
AuditLogRepo AuditLogRepo.AuditLogRepository AuditLogRepo AuditLogRepo.AuditLogRepository
ProjectflockKandangRepo rProjectFlockKandang.ProjectFlockKandangRepository ProjectflockKandangRepo rProjectFlockKandang.ProjectFlockKandangRepository
ProjectflockPopulationRepo rProjectFlock.ProjectFlockPopulationRepository
} }
func NewChickinService(repo repository.ProjectChickinRepository, kandangRepo KandangRepo.KandangRepository, warehouseRepo rWarehouse.WarehouseRepository, productWarehouseRepo rProductWarehouse.ProductWarehouseRepository, projectFlockRepo rProjectFlock.ProjectflockRepository, auditLogRepo AuditLogRepo.AuditLogRepository, projectflockkandangRepo rProjectFlockKandang.ProjectFlockKandangRepository, validate *validator.Validate) ChickinService { func NewChickinService(repo repository.ProjectChickinRepository, kandangRepo KandangRepo.KandangRepository, warehouseRepo rWarehouse.WarehouseRepository, productWarehouseRepo rProductWarehouse.ProductWarehouseRepository, projectFlockRepo rProjectFlock.ProjectflockRepository, auditLogRepo AuditLogRepo.AuditLogRepository, projectflockkandangRepo rProjectFlockKandang.ProjectFlockKandangRepository, projectflockpopulationRepo rProjectFlock.ProjectFlockPopulationRepository, validate *validator.Validate) ChickinService {
return &chickinService{ return &chickinService{
Log: utils.Log, Log: utils.Log,
Validate: validate, Validate: validate,
@@ -53,6 +54,7 @@ func NewChickinService(repo repository.ProjectChickinRepository, kandangRepo Kan
ProjectFlockRepo: projectFlockRepo, ProjectFlockRepo: projectFlockRepo,
AuditLogRepo: auditLogRepo, AuditLogRepo: auditLogRepo,
ProjectflockKandangRepo: projectflockkandangRepo, ProjectflockKandangRepo: projectflockkandangRepo,
ProjectflockPopulationRepo: projectflockpopulationRepo,
} }
} }
@@ -78,8 +80,9 @@ func (s chickinService) GetAll(c *fiber.Ctx, params *validation.Query) ([]entity
chickins, total, err := s.Repository.GetAll(c.Context(), offset, params.Limit, func(db *gorm.DB) *gorm.DB { chickins, total, err := s.Repository.GetAll(c.Context(), offset, params.Limit, func(db *gorm.DB) *gorm.DB {
db = s.withRelations(db) db = s.withRelations(db)
if params.Search != "" {
return db.Where("name LIKE ?", "%"+params.Search+"%") if params.ProjectFlockKandangId != 0 {
return db.Where("project_flock_kandang_id = ?", params.ProjectFlockKandangId)
} }
return db.Order("created_at DESC").Order("updated_at DESC") return db.Order("created_at DESC").Order("updated_at DESC")
}) })
@@ -163,7 +166,7 @@ func (s *chickinService) CreateOne(c *fiber.Ctx, req *validation.Create) (*entit
} }
newChickin := &entity.ProjectChickin{ newChickin := &entity.ProjectChickin{
ProjectFlocKandangId: projectflockkandang.ProjectFlockId, ProjectFlockKandangId: projectflockkandang.ProjectFlockId,
ChickInDate: chickinDate, ChickInDate: chickinDate,
Quantity: productWarehouse.Quantity, Quantity: productWarehouse.Quantity,
Note: "", Note: "",
@@ -188,45 +191,37 @@ func (s *chickinService) CreateOne(c *fiber.Ctx, req *validation.Create) (*entit
s.Log.Errorf("Failed to update product warehouse quantity: %+v", err) s.Log.Errorf("Failed to update product warehouse quantity: %+v", err)
return nil, err return nil, err
} }
// masukan data nya ke project flock population
// masukan check apakah stock availability ada, jika ada update, jika tidak buat baru // check apakah sudah ada
stockAvailability := &entity.StockAvailability{ existingPopulation, err := s.ProjectflockPopulationRepo.GetByProjectFlockKandangID(c.Context(), req.ProjectFlockKandangId)
EntityType: entity.EntityTypeProjectFlockKandang, if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
ReservedQuantity: productWarehouse.Quantity, s.Log.Errorf("Failed to get project flock population: %+v", err)
EntityId: projectflockkandang.Id, return nil, err
ProductId: productWarehouse.ProductId,
} }
if existingPopulation != nil {
// update quantity
var existingStockAvailability entity.StockAvailability err = s.ProjectflockPopulationRepo.PatchOne(c.Context(), existingPopulation.Id, map[string]any{
err = s.ProductWarehouseRepo.DB().WithContext(c.Context()). "reserved_quantity": newChickin.Quantity + existingPopulation.ReservedQuantity,
Where("entity_type = ? AND entity_id = ? AND product_id = ?", stockAvailability.EntityType, stockAvailability.EntityId, stockAvailability.ProductId). }, nil)
First(&existingStockAvailability).Error
if err != nil { if err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) { s.Log.Errorf("Failed to update project flock population: %+v", err)
// buat baru
stockAvailability.ReservedQuantity = newChickin.Quantity
stockAvailability.Quantity = 0
err = s.ProductWarehouseRepo.DB().WithContext(c.Context()).Create(stockAvailability).Error
if err != nil {
s.Log.Errorf("Failed to create stock availability: %+v", err)
return nil, err return nil, err
} }
} else { } else {
s.Log.Errorf("Failed to get stock availability: %+v", err) // create new population
return nil, err newPopulation := &entity.ProjectFlockPopulation{
ProjectFlockKandangId: req.ProjectFlockKandangId,
InitialQuantity: 0,
CurrentQuantity: 0,
ReservedQuantity: newChickin.Quantity,
CreatedBy: 1, // todo: ganti dengan user login
} }
} else { err = s.ProjectflockPopulationRepo.CreateOne(c.Context(), newPopulation, nil)
// update existing
newQuantity := existingStockAvailability.ReservedQuantity + newChickin.Quantity
err = s.ProductWarehouseRepo.DB().WithContext(c.Context()).
Model(&existingStockAvailability).
Update("reserved_quantity", newQuantity).Error
if err != nil { if err != nil {
s.Log.Errorf("Failed to update stock availability: %+v", err) s.Log.Errorf("Failed to create project flock population: %+v", err)
return nil, err return nil, err
} }
} }
return s.GetOne(c, newChickin.Id) return s.GetOne(c, newChickin.Id)
@@ -283,20 +278,21 @@ func (s *chickinService) Approve(c *fiber.Ctx, id uint) error {
return err return err
} }
//pindahkan stock dari reserved ke actual stock //pindahkan stock dari reserved ke actual stock pada table project flock population
// get stock avaibility untuk di update population, err := s.ProjectflockPopulationRepo.GetByProjectFlockKandangID(c.Context(), chickin.ProjectFlockKandangId)
var stockAvailability entity.StockAvailability
err = s.ProductWarehouseRepo.DB().WithContext(c.Context()).
Where("entity_type = ? AND entity_id = ? ", entity.EntityTypeProjectFlockKandang, chickin.ProjectFlocKandangId).
First(&stockAvailability).Error
if err != nil { if err != nil {
s.Log.Errorf("Failed to get stock availability: %+v", err) s.Log.Errorf("Failed to get project flock population: %+v", err)
return err return err
} }
newReservedQuantity := stockAvailability.ReservedQuantity - chickin.Quantity err = s.ProjectflockPopulationRepo.PatchOne(c.Context(), population.Id, map[string]any{
if newReservedQuantity < 0 { "reserved_quantity": population.ReservedQuantity - chickin.Quantity,
newReservedQuantity = 0 "initial_quantity": population.InitialQuantity + chickin.Quantity,
"current_quantity": population.CurrentQuantity + chickin.Quantity,
}, nil)
if err != nil {
s.Log.Errorf("Failed to update project flock population: %+v", err)
return err
} }
return nil return nil
@@ -12,5 +12,5 @@ type Update struct {
type Query struct { type Query struct {
Page int `query:"page" validate:"omitempty,number,min=1"` Page int `query:"page" validate:"omitempty,number,min=1"`
Limit int `query:"limit" validate:"omitempty,number,min=1,max=100"` Limit int `query:"limit" validate:"omitempty,number,min=1,max=100"`
Search string `query:"search" validate:"omitempty,max=50"` ProjectFlockKandangId uint `query:"project_flock_kandang_id" validate:"omitempty,number,min=1"`
} }
@@ -8,6 +8,7 @@ import (
rFlock "gitlab.com/mbugroup/lti-api.git/internal/modules/master/flocks/repositories" rFlock "gitlab.com/mbugroup/lti-api.git/internal/modules/master/flocks/repositories"
rKandang "gitlab.com/mbugroup/lti-api.git/internal/modules/master/kandangs/repositories" rKandang "gitlab.com/mbugroup/lti-api.git/internal/modules/master/kandangs/repositories"
rProjectflock "gitlab.com/mbugroup/lti-api.git/internal/modules/production/project_flocks/repositories" rProjectflock "gitlab.com/mbugroup/lti-api.git/internal/modules/production/project_flocks/repositories"
sProjectflock "gitlab.com/mbugroup/lti-api.git/internal/modules/production/project_flocks/services" sProjectflock "gitlab.com/mbugroup/lti-api.git/internal/modules/production/project_flocks/services"
rUser "gitlab.com/mbugroup/lti-api.git/internal/modules/users/repositories" rUser "gitlab.com/mbugroup/lti-api.git/internal/modules/users/repositories"
@@ -0,0 +1,35 @@
package repository
import (
"context"
"gitlab.com/mbugroup/lti-api.git/internal/common/repository"
entity "gitlab.com/mbugroup/lti-api.git/internal/entities"
"gorm.io/gorm"
)
type ProjectFlockPopulationRepository interface {
repository.BaseRepository[entity.ProjectFlockPopulation]
GetByProjectFlockKandangID(ctx context.Context, projectFlockKandangID uint) (*entity.ProjectFlockPopulation, error)
}
type projectFlockPopulationRepositoryImpl struct {
*repository.BaseRepositoryImpl[entity.ProjectFlockPopulation]
}
func NewProjectFlockPopulationRepository(db *gorm.DB) ProjectFlockPopulationRepository {
return &projectFlockPopulationRepositoryImpl{
BaseRepositoryImpl: repository.NewBaseRepository[entity.ProjectFlockPopulation](db),
}
}
func (r *projectFlockPopulationRepositoryImpl) GetByProjectFlockKandangID(ctx context.Context, projectFlockKandangID uint) (*entity.ProjectFlockPopulation, error) {
var record entity.ProjectFlockPopulation
err := r.DB().WithContext(ctx).
Where("project_flock_kandang_id = ?", projectFlockKandangID).
First(&record).Error
if err != nil {
return nil, err
}
return &record, nil
}