✨ Program member benifits
This commit is contained in:
parent
23e5ba432b
commit
173ef92c01
@ -11,6 +11,15 @@ type ProgramPrice struct {
|
|||||||
Amount float64 `json:"amount"`
|
Amount float64 `json:"amount"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type ProgramBadge struct {
|
||||||
|
Type string `json:"type"`
|
||||||
|
Metadata map[string]any `json:"metadata"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type ProgramGroup struct {
|
||||||
|
ID uint `json:"id"`
|
||||||
|
}
|
||||||
|
|
||||||
type Program struct {
|
type Program struct {
|
||||||
BaseModel
|
BaseModel
|
||||||
|
|
||||||
@ -19,6 +28,8 @@ type Program struct {
|
|||||||
Alias string `json:"alias" gorm:"uniqueIndex"`
|
Alias string `json:"alias" gorm:"uniqueIndex"`
|
||||||
ExpRequirement int64 `json:"exp_requirement"`
|
ExpRequirement int64 `json:"exp_requirement"`
|
||||||
Price datatypes.JSONType[ProgramPrice] `json:"price"`
|
Price datatypes.JSONType[ProgramPrice] `json:"price"`
|
||||||
|
Badge datatypes.JSONType[ProgramBadge] `json:"badge"`
|
||||||
|
Group datatypes.JSONType[ProgramGroup] `json:"group"`
|
||||||
Appearance datatypes.JSONMap `json:"appearance"`
|
Appearance datatypes.JSONMap `json:"appearance"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -9,7 +9,9 @@ import (
|
|||||||
"git.solsynth.dev/hypernet/passport/pkg/internal/database"
|
"git.solsynth.dev/hypernet/passport/pkg/internal/database"
|
||||||
"git.solsynth.dev/hypernet/passport/pkg/internal/gap"
|
"git.solsynth.dev/hypernet/passport/pkg/internal/gap"
|
||||||
"git.solsynth.dev/hypernet/wallet/pkg/proto"
|
"git.solsynth.dev/hypernet/wallet/pkg/proto"
|
||||||
|
"github.com/rs/zerolog/log"
|
||||||
"github.com/samber/lo"
|
"github.com/samber/lo"
|
||||||
|
"gorm.io/datatypes"
|
||||||
)
|
)
|
||||||
|
|
||||||
func JoinProgram(user models.Account, program models.Program) (models.ProgramMember, error) {
|
func JoinProgram(user models.Account, program models.Program) (models.ProgramMember, error) {
|
||||||
@ -36,6 +38,8 @@ func JoinProgram(user models.Account, program models.Program) (models.ProgramMem
|
|||||||
}
|
}
|
||||||
if err := database.C.Create(&member).Error; err != nil {
|
if err := database.C.Create(&member).Error; err != nil {
|
||||||
return member, err
|
return member, err
|
||||||
|
} else {
|
||||||
|
PostJoinProgram(member)
|
||||||
}
|
}
|
||||||
return member, nil
|
return member, nil
|
||||||
}
|
}
|
||||||
@ -47,6 +51,8 @@ func LeaveProgram(user models.Account, program models.Program) error {
|
|||||||
}
|
}
|
||||||
if err := database.C.Delete(&member).Error; err != nil {
|
if err := database.C.Delete(&member).Error; err != nil {
|
||||||
return err
|
return err
|
||||||
|
} else {
|
||||||
|
PostLeaveProgram(member)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@ -86,3 +92,48 @@ func PeriodicChargeProgramFee() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func PostJoinProgram(member models.ProgramMember) error {
|
||||||
|
badge := member.Program.Badge.Data()
|
||||||
|
if len(badge.Type) > 0 {
|
||||||
|
accountBadge := models.Badge{
|
||||||
|
Type: badge.Type,
|
||||||
|
AccountID: member.AccountID,
|
||||||
|
Metadata: datatypes.JSONMap(badge.Metadata),
|
||||||
|
}
|
||||||
|
if err := database.C.Create(&accountBadge).Error; err != nil {
|
||||||
|
log.Error().Err(err).Msg("Failed to create badge for program member...")
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
group := member.Program.Group.Data()
|
||||||
|
if group.ID > 0 {
|
||||||
|
accountGroup := models.AccountGroupMember{
|
||||||
|
GroupID: group.ID,
|
||||||
|
AccountID: member.AccountID,
|
||||||
|
}
|
||||||
|
if err := database.C.Create(&accountGroup).Error; err != nil {
|
||||||
|
log.Error().Err(err).Msg("Failed to create group for program member...")
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func PostLeaveProgram(member models.ProgramMember) error {
|
||||||
|
badge := member.Program.Badge.Data()
|
||||||
|
if len(badge.Type) > 0 {
|
||||||
|
if err := database.C.Where("account_id = ? AND type = ?", member.AccountID, badge.Type).Delete(&models.Badge{}).Error; err != nil {
|
||||||
|
log.Error().Err(err).Msg("Failed to delete badge for program member...")
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
group := member.Program.Group.Data()
|
||||||
|
if group.ID > 0 {
|
||||||
|
if err := database.C.Where("account_id = ? AND group_id = ?", member.AccountID, group.ID).Delete(&models.AccountGroupMember{}).Error; err != nil {
|
||||||
|
log.Error().Err(err).Msg("Failed to delete group for program member...")
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user