Yimaru-BackEnd/internal/domain/settings.go

194 lines
6.2 KiB
Go

package domain
import (
"strconv"
"time"
)
type Setting struct {
Key string
Value string
UpdatedAt time.Time
}
type SettingRes struct {
Key string `json:"key"`
Value string `json:"value"`
UpdatedAt time.Time `json:"updated_at"`
}
type UpdateSettingListReq struct {
SMSProvider *string `json:"sms_provider,omitempty"`
MaxNumberOfOutcomes *int64 `json:"max_number_of_outcomes,omitempty"`
BetAmountLimit *float32 `json:"bet_amount_limit,omitempty"`
DailyTicketPerIP *int64 `json:"daily_ticket_limit,omitempty"`
TotalWinningLimit *float32 `json:"total_winning_limit,omitempty"`
AmountForBetReferral *float32 `json:"amount_for_bet_referral,omitempty"`
CashbackAmountCap *float32 `json:"cashback_amount_cap,omitempty"`
}
type SettingList struct {
SMSProvider SMSProvider `json:"sms_provider"`
MaxNumberOfOutcomes int64 `json:"max_number_of_outcomes"`
BetAmountLimit Currency `json:"bet_amount_limit"`
DailyTicketPerIP int64 `json:"daily_ticket_limit"`
TotalWinningLimit Currency `json:"total_winning_limit"`
AmountForBetReferral Currency `json:"amount_for_bet_referral"`
CashbackAmountCap Currency `json:"cashback_amount_cap"`
}
type SettingListRes struct {
SMSProvider SMSProvider `json:"sms_provider"`
MaxNumberOfOutcomes int64 `json:"max_number_of_outcomes"`
BetAmountLimit float32 `json:"bet_amount_limit"`
DailyTicketPerIP int64 `json:"daily_ticket_limit"`
TotalWinningLimit float32 `json:"total_winning_limit"`
AmountForBetReferral float32 `json:"amount_for_bet_referral"`
CashbackAmountCap float32 `json:"cashback_amount_cap"`
}
type ValidSettingList struct {
SMSProvider ValidString
MaxNumberOfOutcomes ValidInt64
BetAmountLimit ValidInt64
DailyTicketPerIP ValidInt64
TotalWinningLimit ValidInt64
AmountForBetReferral ValidInt64
CashbackAmountCap ValidInt64
}
func ConvertInt64SettingsMap(dbSettingList *ValidSettingList) map[string]*ValidInt64 {
return map[string]*ValidInt64{
"max_number_of_outcomes": &dbSettingList.MaxNumberOfOutcomes,
"bet_amount_limit": &dbSettingList.BetAmountLimit,
"daily_ticket_limit": &dbSettingList.DailyTicketPerIP,
"total_winnings_limit": &dbSettingList.TotalWinningLimit,
"amount_for_bet_referral": &dbSettingList.AmountForBetReferral,
"cashback_amount_cap": &dbSettingList.CashbackAmountCap,
}
}
func ConvertStringSettingsMap(dbSettingList *ValidSettingList) map[string]*ValidString {
return map[string]*ValidString{
"sms_provider": &dbSettingList.SMSProvider,
}
}
func ConvertBoolSettingsMap(dbSettingList *ValidSettingList) map[string]*ValidBool {
return map[string]*ValidBool{}
}
func ConvertFloat32SettingsMap(dbSettingList *ValidSettingList) map[string]*ValidFloat32 {
return map[string]*ValidFloat32{}
}
func ConvertTimeSettingsMap(dbSettingList *ValidSettingList) map[string]*ValidTime {
return map[string]*ValidTime{}
}
func ValidateSettingList(dbSettingList ValidSettingList) SettingList {
// TODO: Add validation here
return SettingList{
SMSProvider: SMSProvider(dbSettingList.SMSProvider.Value),
MaxNumberOfOutcomes: dbSettingList.MaxNumberOfOutcomes.Value,
BetAmountLimit: Currency(dbSettingList.BetAmountLimit.Value),
DailyTicketPerIP: dbSettingList.DailyTicketPerIP.Value,
TotalWinningLimit: Currency(dbSettingList.TotalWinningLimit.Value),
AmountForBetReferral: Currency(dbSettingList.AmountForBetReferral.Value),
CashbackAmountCap: Currency(dbSettingList.CashbackAmountCap.Value),
}
}
func ConvertValidSettingList(settingList ValidSettingList) []Setting {
var convertedSettings []Setting
// if settingList.AmountForBetReferral.Valid {
// newValue := strconv.FormatInt(settingList.AmountForBetReferral.Value, 10)
// settings = append(settings, Setting{
// Key: "amount_for_bet_referral",
// Value: newValue,
// })
// }
int64SettingsMap := ConvertInt64SettingsMap(&settingList)
stringSettingsMap := ConvertStringSettingsMap(&settingList)
boolSettingsMap := ConvertBoolSettingsMap(&settingList)
float32SettingsMap := ConvertFloat32SettingsMap(&settingList)
timeSettingsMap := ConvertTimeSettingsMap(&settingList)
for key, settingPtr := range int64SettingsMap {
setting := *settingPtr
if setting.Valid {
stringVal := strconv.FormatInt(setting.Value, 10)
convertedSettings = append(convertedSettings, Setting{
Key: key,
Value: stringVal,
})
}
}
for key, settingPtr := range stringSettingsMap {
setting := *settingPtr
if setting.Valid {
convertedSettings = append(convertedSettings, Setting{
Key: key,
Value: setting.Value,
})
}
}
for key, settingPtr := range boolSettingsMap {
setting := *settingPtr
if setting.Valid {
stringVal := strconv.FormatBool(setting.Value)
convertedSettings = append(convertedSettings, Setting{
Key: key,
Value: stringVal,
})
}
}
for key, settingPtr := range float32SettingsMap {
setting := *settingPtr
if setting.Valid {
stringVal := strconv.FormatFloat(float64(setting.Value), 'E', -1, 64)
convertedSettings = append(convertedSettings, Setting{
Key: key,
Value: stringVal,
})
}
}
for key, settingPtr := range timeSettingsMap {
setting := *settingPtr
if setting.Valid {
var stringVal string = setting.Value.Format("2006-01-02 15:04:05")
convertedSettings = append(convertedSettings, Setting{
Key: key,
Value: stringVal,
})
}
}
return convertedSettings
}
func ConvertSetting(setting Setting) SettingRes {
return SettingRes{
Key: setting.Key,
Value: setting.Value,
UpdatedAt: setting.UpdatedAt,
}
}
func ConvertUpdateSettingListReq(settings UpdateSettingListReq) ValidSettingList {
return ValidSettingList{
SMSProvider: ConvertStringPtr(settings.SMSProvider),
MaxNumberOfOutcomes: ConvertInt64Ptr(settings.MaxNumberOfOutcomes),
BetAmountLimit: ConvertCurrencyFloatPtr(settings.BetAmountLimit),
DailyTicketPerIP: ConvertInt64Ptr(settings.DailyTicketPerIP),
TotalWinningLimit: ConvertCurrencyFloatPtr(settings.TotalWinningLimit),
AmountForBetReferral: ConvertCurrencyFloatPtr(settings.AmountForBetReferral),
CashbackAmountCap: ConvertCurrencyFloatPtr(settings.CashbackAmountCap),
}
}