diff --git a/internal/entity/auth.go b/internal/entity/auth.go index a9cc6c6..6945a24 100644 --- a/internal/entity/auth.go +++ b/internal/entity/auth.go @@ -83,18 +83,19 @@ func (UserDB) TableName() string { return "users" } -func (u *UserDB) ToUserAuthenticate(signedToken string) *AuthenticateUser { +func (u *UserDB) ToUserAuthenticate(signedToken string, license PartnerLicense) *AuthenticateUser { return &AuthenticateUser{ - Token: signedToken, - Name: u.Name, - RoleID: role.Role(u.RoleID), - RoleName: u.RoleName, - PartnerID: u.PartnerID, - PartnerName: u.PartnerName, - PartnerStatus: u.PartnerStatus, - SiteID: u.SiteID, - SiteName: u.SiteName, - ResetPassword: u.ResetPassword, + Token: signedToken, + Name: u.Name, + RoleID: role.Role(u.RoleID), + RoleName: u.RoleName, + PartnerID: u.PartnerID, + PartnerName: u.PartnerName, + PartnerStatus: u.PartnerStatus, + SiteID: u.SiteID, + SiteName: u.SiteName, + ResetPassword: u.ResetPassword, + PartnerLicense: license, } } diff --git a/internal/entity/license.go b/internal/entity/license.go index 01431b3..497d35c 100644 --- a/internal/entity/license.go +++ b/internal/entity/license.go @@ -93,3 +93,29 @@ func (o *LicenseDB) ToUpdatedLicense(updatedBy int64, req License) { o.SerialNumber = req.SerialNumber } } + +type PartnerLicense struct { + PartnerID int64 `json:"partner_id"` + LicenseStatus string `json:"license_status"` + DaysToExpire int64 `json:"days_to_expire"` +} + +func (l *LicenseDB) ToPartnerLicense() PartnerLicense { + now := time.Now() + daysToExpire := int64(l.EndDate.Sub(now).Hours() / 24) + + var licenseStatus string + if daysToExpire < 0 { + licenseStatus = "EXPIRED" + } else if daysToExpire <= 30 { + licenseStatus = "EXPIRING_SOON" + } else { + licenseStatus = "ACTIVE" + } + + return PartnerLicense{ + PartnerID: l.PartnerID, + DaysToExpire: daysToExpire, + LicenseStatus: licenseStatus, + } +} diff --git a/internal/entity/user.go b/internal/entity/user.go index 6bbb138..338a1b3 100644 --- a/internal/entity/user.go +++ b/internal/entity/user.go @@ -29,16 +29,17 @@ type User struct { } type AuthenticateUser struct { - Token string - Name string - RoleID role.Role - RoleName string - PartnerID *int64 - PartnerName string - PartnerStatus string - SiteID *int64 - SiteName string - ResetPassword bool + Token string + Name string + RoleID role.Role + RoleName string + PartnerID *int64 + PartnerName string + PartnerStatus string + SiteID *int64 + SiteName string + ResetPassword bool + PartnerLicense PartnerLicense } type UserRoleDB struct { diff --git a/internal/handlers/http/auth/auth.go b/internal/handlers/http/auth/auth.go index ef97909..159abed 100644 --- a/internal/handlers/http/auth/auth.go +++ b/internal/handlers/http/auth/auth.go @@ -82,6 +82,10 @@ func (h *AuthHandler) AuthLogin(c *gin.Context) { }, Site: site, ResetPassword: authUser.ResetPassword, + PartnerLicense: &response.PartnerLicense{ + DaysToExpire: authUser.PartnerLicense.DaysToExpire, + Status: authUser.PartnerLicense.LicenseStatus, + }, } c.JSON(http.StatusOK, response.BaseResponse{ diff --git a/internal/handlers/response/auth.go b/internal/handlers/response/auth.go index 8c2d674..e86ee15 100644 --- a/internal/handlers/response/auth.go +++ b/internal/handlers/response/auth.go @@ -1,15 +1,21 @@ package response type LoginResponse struct { - Token string `json:"token"` - Name string `json:"name"` - Role Role `json:"role"` - Partner *Partner `json:"partner"` - Site *SiteName `json:"site,omitempty"` - ResetPassword bool `json:"reset_password"` + Token string `json:"token"` + Name string `json:"name"` + Role Role `json:"role"` + Partner *Partner `json:"partner"` + Site *SiteName `json:"site,omitempty"` + ResetPassword bool `json:"reset_password"` + PartnerLicense *PartnerLicense `json:"partner_license,omitempty"` } type Role struct { ID int64 `json:"id"` Role string `json:"role_name"` } + +type PartnerLicense struct { + DaysToExpire int64 `json:"days_to_expire,omitempty"` + Status string `json:"status,omitempty"` +} diff --git a/internal/repository/license/license.go b/internal/repository/license/license.go index 516e599..e2623da 100644 --- a/internal/repository/license/license.go +++ b/internal/repository/license/license.go @@ -84,3 +84,14 @@ func (r *LicenseRepository) GetAll(ctx context.Context, limit, offset int, statu return licenses, total, nil } + +func (r *LicenseRepository) FindByPartnerIDMaxEndDate(ctx context.Context, partnerID *int64) (*entity.LicenseDB, error) { + var licenseDB entity.LicenseDB + if err := r.db.WithContext(ctx). + Where("partner_id = ?", partnerID). + Order("end_date DESC"). + First(&licenseDB).Error; err != nil { + return nil, err + } + return &licenseDB, nil +} diff --git a/internal/repository/repository.go b/internal/repository/repository.go index c10fa60..e5fcedd 100644 --- a/internal/repository/repository.go +++ b/internal/repository/repository.go @@ -205,6 +205,7 @@ type License interface { Update(ctx context.Context, license *entity.LicenseDB) (*entity.LicenseDB, error) FindByID(ctx context.Context, id string) (*entity.LicenseDB, error) GetAll(ctx context.Context, limit, offset int, statusFilter string) ([]*entity.LicenseGetAll, int64, error) + FindByPartnerIDMaxEndDate(ctx context.Context, partnerID *int64) (*entity.LicenseDB, error) } type TransactionRepository interface { diff --git a/internal/services/auth/init.go b/internal/services/auth/init.go index a797b8c..b9a7767 100644 --- a/internal/services/auth/init.go +++ b/internal/services/auth/init.go @@ -21,11 +21,13 @@ type AuthServiceImpl struct { emailSvc repository.EmailService emailCfg config.Email trxRepo repository.TransactionManager + license repository.License } func New(authRepo repository.Auth, crypto repository.Crypto, user repository.User, emailSvc repository.EmailService, emailCfg config.Email, trxRepo repository.TransactionManager, + license repository.License, ) *AuthServiceImpl { return &AuthServiceImpl{ authRepo: authRepo, @@ -34,6 +36,7 @@ func New(authRepo repository.Auth, emailSvc: emailSvc, emailCfg: emailCfg, trxRepo: trxRepo, + license: license, } } @@ -57,8 +60,18 @@ func (u *AuthServiceImpl) AuthenticateUser(ctx context.Context, email, password if err != nil { return nil, err } + var licensePartner entity.PartnerLicense - return user.ToUserAuthenticate(signedToken), nil + if user.PartnerID != nil { + parterLicense, err := u.license.FindByPartnerIDMaxEndDate(ctx, user.PartnerID) + if err != nil { + logger.ContextLogger(ctx).Error("error when get user license", zap.Error(err)) + return nil, errors.ErrorInternalServer + } + licensePartner = parterLicense.ToPartnerLicense() + } + + return user.ToUserAuthenticate(signedToken, licensePartner), nil } func (u *AuthServiceImpl) SendPasswordResetLink(ctx context.Context, email string) error { diff --git a/internal/services/service.go b/internal/services/service.go index 3b62b4d..c3ea03a 100644 --- a/internal/services/service.go +++ b/internal/services/service.go @@ -42,7 +42,7 @@ type ServiceManagerImpl struct { func NewServiceManagerImpl(cfg *config.Config, repo *repository.RepoManagerImpl) *ServiceManagerImpl { return &ServiceManagerImpl{ - AuthSvc: auth.New(repo.Auth, repo.Crypto, repo.User, repo.EmailService, cfg.Email, repo.Trx), + AuthSvc: auth.New(repo.Auth, repo.Crypto, repo.User, repo.EmailService, cfg.Email, repo.Trx, repo.License), EventSvc: event.NewEventService(repo.Event), UserSvc: users.NewUserService(repo.User, repo.Branch), BranchSvc: branch.NewBranchService(repo.Branch),