package repository import ( "context" "database/sql" "furtuna-be/internal/repository/branches" mdtrns "furtuna-be/internal/repository/midtrans" "furtuna-be/internal/repository/orders" "furtuna-be/internal/repository/oss" "furtuna-be/internal/repository/partners" "furtuna-be/internal/repository/payment" "furtuna-be/internal/repository/products" "furtuna-be/internal/repository/sites" "furtuna-be/internal/repository/studios" "furtuna-be/internal/repository/trx" "furtuna-be/internal/repository/users" repository "furtuna-be/internal/repository/wallet" "github.com/golang-jwt/jwt" "gorm.io/gorm" "furtuna-be/config" "furtuna-be/internal/entity" "furtuna-be/internal/repository/auth" "furtuna-be/internal/repository/crypto" event "furtuna-be/internal/repository/events" ) type RepoManagerImpl struct { Crypto Crypto Auth Auth Event Event User User Branch Branch Studio Studio Product Product Order Order OSS OSSRepository Partner PartnerRepository Site SiteRepository Trx TransactionManager Wallet WalletRepository Midtrans Midtrans Payment Payment } func NewRepoManagerImpl(db *gorm.DB, cfg *config.Config) *RepoManagerImpl { return &RepoManagerImpl{ Crypto: crypto.NewCrypto(cfg.Auth()), Auth: auth.NewAuthRepository(db), Event: event.NewEventRepo(db), User: users.NewUserRepository(db), Branch: branches.NewBranchRepository(db), Studio: studios.NewStudioRepository(db), Product: products.NewProductRepository(db), Order: orders.NewOrderRepository(db), OSS: oss.NewOssRepositoryImpl(cfg.OSSConfig), Partner: partners.NewPartnerRepository(db), Site: sites.NewSiteRepository(db), Trx: trx.NewGormTransactionManager(db), Wallet: repository.NewWalletRepository(db), Midtrans: mdtrns.New(&cfg.Midtrans), Payment: payment.NewPaymentRepository(db), } } type Auth interface { CheckExistsUserAccount(ctx context.Context, email string) (*entity.UserDB, error) } type Event interface { CreateEvent(ctx context.Context, event *entity.EventDB) (*entity.EventDB, error) UpdateEvent(ctx context.Context, event *entity.EventDB) (*entity.EventDB, error) GetEventByID(ctx context.Context, id int64) (*entity.EventDB, error) GetAllEvents(ctx context.Context, nameFilter string, limit, offset int) (entity.EventList, int, error) DeleteEvent(ctx context.Context, id int64) error } type Crypto interface { CompareHashAndPassword(hash string, password string) bool ValidateWT(tokenString string) (*jwt.Token, error) GenerateJWT(user *entity.User) (string, error) GenerateJWTOrder(order *entity.Order) (string, error) ValidateJWTOrder(tokenString string) (int64, int64, error) ParseAndValidateJWT(token string) (*entity.JWTAuthClaims, error) } type User interface { Create(ctx context.Context, user *entity.UserDB) (*entity.UserDB, error) CreateWithTx(ctx context.Context, tx *gorm.DB, user *entity.UserDB) (*entity.UserDB, error) GetAllUsers(ctx context.Context, req entity.UserSearch) (entity.UserList, int, error) GetUserByID(ctx context.Context, id int64) (*entity.UserDB, error) GetUserByEmail(ctx context.Context, email string) (*entity.UserDB, error) UpdateUser(ctx context.Context, user *entity.UserDB) (*entity.UserDB, error) } type Branch interface { CreateBranch(ctx context.Context, branch *entity.BranchDB) (*entity.BranchDB, error) UpdateBranch(ctx context.Context, branch *entity.BranchDB) (*entity.BranchDB, error) GetBranchByID(ctx context.Context, id int64) (*entity.BranchDB, error) GetAllBranches(ctx context.Context, req entity.BranchSearch) (entity.BranchList, int, error) DeleteBranch(ctx context.Context, id int64) error } type Studio interface { CreateStudio(ctx context.Context, studio *entity.StudioDB) (*entity.StudioDB, error) UpdateStudio(ctx context.Context, studio *entity.StudioDB) (*entity.StudioDB, error) GetStudioByID(ctx context.Context, id int64) (*entity.StudioDB, error) SearchStudios(ctx context.Context, req entity.StudioSearch) (entity.StudioList, int, error) } type Product interface { CreateProduct(ctx context.Context, product *entity.ProductDB) (*entity.ProductDB, error) UpdateProduct(ctx context.Context, product *entity.ProductDB) (*entity.ProductDB, error) GetProductByID(ctx context.Context, id int64) (*entity.ProductDB, error) GetProductByPartnerIDAndSiteID(ctx context.Context, partnerID, siteID int64) (entity.ProductList, error) GetAllProducts(ctx context.Context, req entity.ProductSearch) (entity.ProductList, int, error) DeleteProduct(ctx context.Context, id int64) error GetProductsByIDs(ctx context.Context, ids []int64, partnerID int64) ([]*entity.ProductDB, error) } type Order interface { Create(ctx context.Context, order *entity.Order) (*entity.Order, error) FindByID(ctx context.Context, id int64) (*entity.Order, error) Update(ctx context.Context, order *entity.Order) (*entity.Order, error) SetOrderStatus(ctx context.Context, db *gorm.DB, orderID int64, status string) error } type OSSRepository interface { UploadFile(ctx context.Context, fileName string, fileContent []byte) (fileUrl string, err error) GetPublicURL(fileName string) string } type PartnerRepository interface { Create(ctx context.Context, branch *entity.PartnerDB) (*entity.PartnerDB, error) CreateWithTx(ctx context.Context, tx *gorm.DB, Partner *entity.PartnerDB) (*entity.PartnerDB, error) Update(ctx context.Context, branch *entity.PartnerDB) (*entity.PartnerDB, error) GetByID(ctx context.Context, id int64) (*entity.PartnerDB, error) GetAll(ctx context.Context, req entity.PartnerSearch) (entity.PartnerList, int, error) Delete(ctx context.Context, id int64) error } type SiteRepository interface { Upsert(ctx context.Context, site *entity.Site) (*entity.Site, error) Create(ctx context.Context, branch *entity.SiteDB) (*entity.SiteDB, error) Update(ctx context.Context, branch *entity.SiteDB) (*entity.SiteDB, error) GetByID(ctx context.Context, id int64) (*entity.SiteDB, error) GetAll(ctx context.Context, req entity.SiteSearch) (entity.SiteList, int, error) Delete(ctx context.Context, id int64) error } type TransactionManager interface { Begin(ctx context.Context, opts ...*sql.TxOptions) (*gorm.DB, error) Commit(session *gorm.DB) *gorm.DB Rollback(session *gorm.DB) *gorm.DB } type WalletRepository interface { Create(ctx context.Context, tx *gorm.DB, wallet *entity.Wallet) (*entity.Wallet, error) Update(ctx context.Context, db *gorm.DB, wallet *entity.Wallet) (*entity.Wallet, error) GetByPartnerID(ctx context.Context, db *gorm.DB, partnerID int64) (*entity.Wallet, error) } type Midtrans interface { CreatePayment(order entity.MidtransRequest) (*entity.MidtransResponse, error) } type Payment interface { Create(ctx context.Context, payment *entity.Payment) (*entity.Payment, error) Update(ctx context.Context, payment *entity.Payment) (*entity.Payment, error) UpdateWithTx(ctx context.Context, tx *gorm.DB, payment *entity.Payment) (*entity.Payment, error) FindByOrderAndPartnerID(ctx context.Context, orderID, partnerID int64) (*entity.Payment, error) FindByReferenceID(ctx context.Context, db *gorm.DB, referenceID string) (*entity.Payment, error) }