Add User Partner and Product

This commit is contained in:
aditya.siregar
2024-06-03 14:40:50 +07:00
parent 67f1dbc850
commit 8a23e72230
46 changed files with 1366 additions and 213 deletions
+5 -2
View File
@@ -4,7 +4,6 @@ import (
"context"
"errors"
"fmt"
"go.uber.org/zap"
"gorm.io/gorm"
@@ -27,13 +26,17 @@ func (r *AuthRepository) CheckExistsUserAccount(ctx context.Context, email strin
err := r.db.
Table("users").
Select("users.*, user_roles.role_id, user_roles.partner_id, roles.role_name, partners.name as partner_name").
Select("users.*, user_roles.role_id, user_roles.partner_id, roles.role_name, partners.name as partner_name, partners.status as partner_status").
Where("users.email = ?", email).
Joins("left join user_roles on users.id = user_roles.user_id").
Joins("left join roles on user_roles.role_id = roles.role_id").
Joins("left join partners on user_roles.partner_id = partners.id").
First(&user).Error
if errors.Is(err, gorm.ErrRecordNotFound) {
return nil, nil
}
if err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) {
return nil, fmt.Errorf("user with email %s does not exist", email) // or use a custom error type
+7 -7
View File
@@ -44,9 +44,9 @@ func (c *CryptoImpl) ValidateWT(tokenString string) (*jwt.Token, error) {
}
func (c *CryptoImpl) GenerateJWT(user *entity.User) (string, error) {
branchID := int64(0)
partnerID := int64(0)
if user.PartnerID != nil {
branchID = *user.PartnerID
partnerID = *user.PartnerID
}
claims := &entity.JWTAuthClaims{
@@ -56,11 +56,11 @@ func (c *CryptoImpl) GenerateJWT(user *entity.User) (string, error) {
IssuedAt: time.Now().Unix(),
NotBefore: time.Now().Unix(),
},
UserID: user.ID,
Name: user.Name,
Email: user.Email,
Role: int(user.RoleID),
BranchID: branchID,
UserID: user.ID,
Name: user.Name,
Email: user.Email,
Role: int(user.RoleID),
PartnerID: partnerID,
}
token, err := jwt.
+9
View File
@@ -28,6 +28,15 @@ func (b *PartnerRepository) Create(ctx context.Context, Partner *entity.PartnerD
return Partner, nil
}
func (b *PartnerRepository) CreateWithTx(ctx context.Context, tx *gorm.DB, Partner *entity.PartnerDB) (*entity.PartnerDB, error) {
err := tx.Create(Partner).Error
if err != nil {
logger.ContextLogger(ctx).Error("error when create Partner", zap.Error(err))
return nil, err
}
return Partner, nil
}
func (b *PartnerRepository) Update(ctx context.Context, Partner *entity.PartnerDB) (*entity.PartnerDB, error) {
if err := b.db.Save(Partner).Error; err != nil {
logger.ContextLogger(ctx).Error("error when update Partner", zap.Error(err))
+31 -1
View File
@@ -2,14 +2,17 @@ package repository
import (
"context"
"database/sql"
"furtuna-be/internal/repository/branches"
"furtuna-be/internal/repository/orders"
"furtuna-be/internal/repository/oss"
"furtuna-be/internal/repository/partners"
"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"
@@ -31,6 +34,9 @@ type RepoManagerImpl struct {
Order Order
OSS OSSRepository
Partner PartnerRepository
Site SiteRepository
Trx TransactionManager
Wallet WalletRepository
}
func NewRepoManagerImpl(db *gorm.DB, cfg *config.Config) *RepoManagerImpl {
@@ -45,6 +51,9 @@ func NewRepoManagerImpl(db *gorm.DB, cfg *config.Config) *RepoManagerImpl {
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),
}
}
@@ -69,6 +78,7 @@ type Crypto interface {
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)
@@ -115,8 +125,28 @@ type OSSRepository interface {
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)
}
+131
View File
@@ -0,0 +1,131 @@
package sites
import (
"context"
"furtuna-be/internal/common/logger"
"furtuna-be/internal/entity"
"go.uber.org/zap"
"gorm.io/gorm"
)
type SiteRepository struct {
db *gorm.DB
}
func NewSiteRepository(db *gorm.DB) *SiteRepository {
return &SiteRepository{
db: db,
}
}
func (r *SiteRepository) Upsert(ctx context.Context, site *entity.Site) (*entity.Site, error) {
err := r.db.Transaction(func(tx *gorm.DB) error {
if site.ID != 0 {
// Update site
if err := tx.Save(site).Error; err != nil {
return err
}
} else {
// Create new site
if err := tx.Create(site).Error; err != nil {
return err
}
}
if len(site.Products) > 0 {
for i := range site.Products {
site.Products[i].SiteID = site.ID
if site.Products[i].ID != 0 {
// Update existing product
if err := tx.Save(&site.Products[i]).Error; err != nil {
return err
}
} else {
// Create new product
if err := tx.Create(&site.Products[i]).Error; err != nil {
return err
}
}
}
}
return nil
})
if err != nil {
logger.ContextLogger(ctx).Error("error when upserting site", zap.Error(err))
return nil, err
}
return site, nil
}
func (r *SiteRepository) Create(ctx context.Context, site *entity.SiteDB) (*entity.SiteDB, error) {
err := r.db.Create(site).Error
if err != nil {
logger.ContextLogger(ctx).Error("error when creating site", zap.Error(err))
return nil, err
}
return site, nil
}
func (r *SiteRepository) Update(ctx context.Context, site *entity.SiteDB) (*entity.SiteDB, error) {
if err := r.db.Save(site).Error; err != nil {
logger.ContextLogger(ctx).Error("error when updating site", zap.Error(err))
return nil, err
}
return site, nil
}
func (r *SiteRepository) GetByID(ctx context.Context, id int64) (*entity.SiteDB, error) {
site := new(entity.SiteDB)
if err := r.db.First(site, id).Error; err != nil {
logger.ContextLogger(ctx).Error("error when getting site by ID", zap.Error(err))
return nil, err
}
return site, nil
}
func (r *SiteRepository) GetAll(ctx context.Context, req entity.SiteSearch) (entity.SiteList, int, error) {
var sites []*entity.SiteDB
var total int64
query := r.db
query = query.Where("deleted_at IS NULL")
if req.Search != "" {
query = query.Where("name ILIKE ?", "%"+req.Search+"%")
}
if req.Name != "" {
query = query.Where("name ILIKE ?", "%"+req.Name+"%")
}
if req.Limit > 0 {
query = query.Limit(req.Limit)
}
if req.Offset > 0 {
query = query.Offset(req.Offset)
}
if err := query.Find(&sites).Error; err != nil {
logger.ContextLogger(ctx).Error("error when getting all sites", zap.Error(err))
return nil, 0, err
}
if err := r.db.Model(&entity.SiteDB{}).Where(query).Count(&total).Error; err != nil {
logger.ContextLogger(ctx).Error("error when counting sites", zap.Error(err))
return nil, 0, err
}
return sites, int(total), nil
}
func (r *SiteRepository) Delete(ctx context.Context, id int64) error {
site := new(entity.SiteDB)
site.ID = id
if err := r.db.Delete(site).Error; err != nil {
return err
}
return nil
}
+33
View File
@@ -0,0 +1,33 @@
package trx
import (
"context"
"database/sql"
"gorm.io/gorm"
)
type GormTransactionManager struct {
db *gorm.DB
}
func NewGormTransactionManager(db *gorm.DB) *GormTransactionManager {
return &GormTransactionManager{
db: db,
}
}
func (tm *GormTransactionManager) Begin(ctx context.Context, opts ...*sql.TxOptions) (*gorm.DB, error) {
tx := tm.db.Begin(opts...)
if tx.Error != nil {
return nil, tx.Error
}
return tx, nil
}
func (tm *GormTransactionManager) Commit(tx *gorm.DB) *gorm.DB {
return tx.Commit()
}
func (tm *GormTransactionManager) Rollback(tx *gorm.DB) *gorm.DB {
return tx.Rollback()
}
+23
View File
@@ -51,6 +51,29 @@ func (r *UserRepository) Create(ctx context.Context, user *entity.UserDB) (*enti
return user, nil
}
func (r *UserRepository) CreateWithTx(ctx context.Context, tx *gorm.DB, user *entity.UserDB) (*entity.UserDB, error) {
user.ID = 0
if err := tx.Select("name", "email", "password", "status", "created_by", "nik", "user_type", "phone_number").Create(user).Error; err != nil {
logError(ctx, "creating user", err)
return nil, err
}
if err := tx.First(user, user.ID).Error; err != nil {
tx.Rollback()
logError(ctx, "retrieving user", err)
return nil, err
}
userRole := user.ToUserRoleDB()
if err := tx.Create(userRole).Error; err != nil {
tx.Rollback()
logError(ctx, "creating user role", err)
return nil, err
}
return user, nil
}
func (b *UserRepository) GetAllUsers(ctx context.Context, req entity.UserSearch) (entity.UserList, int, error) {
var users []*entity.UserDB
var total int64
+65
View File
@@ -0,0 +1,65 @@
package repository
import (
"context"
"furtuna-be/internal/common/logger"
"furtuna-be/internal/entity"
"go.uber.org/zap"
"gorm.io/gorm"
)
type WalletRepository struct {
db *gorm.DB
}
func NewWalletRepository(db *gorm.DB) *WalletRepository {
return &WalletRepository{
db: db,
}
}
func (r *WalletRepository) Create(ctx context.Context, tx *gorm.DB, wallet *entity.Wallet) (*entity.Wallet, error) {
err := tx.Create(wallet).Error
if err != nil {
logger.ContextLogger(ctx).Error("error when creating wallet", zap.Error(err))
return nil, err
}
return wallet, nil
}
func (r *WalletRepository) Update(ctx context.Context, wallet *entity.Wallet) (*entity.Wallet, error) {
if err := r.db.Save(wallet).Error; err != nil {
logger.ContextLogger(ctx).Error("error when updating wallet", zap.Error(err))
return nil, err
}
return wallet, nil
}
func (r *WalletRepository) GetByID(ctx context.Context, id int64) (*entity.Wallet, error) {
wallet := new(entity.Wallet)
if err := r.db.First(wallet, id).Error; err != nil {
logger.ContextLogger(ctx).Error("error when getting wallet by id", zap.Error(err))
return nil, err
}
return wallet, nil
}
func (r *WalletRepository) GetAll(ctx context.Context) ([]*entity.Wallet, error) {
var wallets []*entity.Wallet
if err := r.db.Find(&wallets).Error; err != nil {
logger.ContextLogger(ctx).Error("error when getting all wallets", zap.Error(err))
return nil, err
}
return wallets, nil
}
func (r *WalletRepository) Delete(ctx context.Context, id int64) error {
wallet := new(entity.Wallet)
wallet.ID = id
if err := r.db.Delete(wallet).Error; err != nil {
logger.ContextLogger(ctx).Error("error when deleting wallet", zap.Error(err))
return err
}
return nil
}