From cdbc5627bade24b3ee7266110ed5ebdb0e41af30 Mon Sep 17 00:00:00 2001 From: Blane Thompson Date: Mon, 5 Aug 2024 18:43:16 +0000 Subject: [PATCH] Core: Fix expiration of migrated memberships. Removes Legacy 3 and 5 memberships in favour of 3/5 entries of LegacyWelcomerPro --- migration-service/main.go | 34 +++++-- welcomer-backend/backend/routes_billing.go | 6 +- welcomer-core/auth.go | 8 +- welcomer-core/database/database.go | 2 +- welcomer-core/database/database_enum.go | 97 ++++++++++++++----- welcomer-core/database/database_enum_utils.go | 8 +- 6 files changed, 103 insertions(+), 52 deletions(-) diff --git a/migration-service/main.go b/migration-service/main.go index 3678aff..979fe2b 100755 --- a/migration-service/main.go +++ b/migration-service/main.go @@ -569,6 +569,13 @@ type UserInfo struct { IP []string `json:"ip"` } +func maxTime(a time.Time, b time.Time) time.Time { + if a.After(b) { + return a + } + return b +} + type BorderwallInfo struct { Activated bool `json:"a"` // borderwall.activated GuildID StringNumber `json:"gi"` // borderwall.guild_id @@ -894,6 +901,7 @@ func migrateUserData(id int64, structure UserInfo) { }() nowUnix := time.Now().Unix() + memspiration := time.Time{} // Create transactions m, err := q.GetUserMembershipsByUserID(ctx, id) @@ -938,11 +946,12 @@ func migrateUserData(id int64, structure UserInfo) { StartedAt: time.Unix(int64(structure.Memberships.WelcomerPro1.Until), 0).AddDate(0, -1, 0), ExpiresAt: time.Unix(int64(structure.Memberships.WelcomerPro1.Until), 0), Status: utils.If(int64(structure.Memberships.WelcomerPro1.Until) > nowUnix, int32(database.MembershipStatusActive), int32(database.MembershipStatusExpired)), - MembershipType: int32(database.MembershipTypeLegacyWelcomerPro1), + MembershipType: int32(database.MembershipTypeLegacyWelcomerPro), TransactionUuid: t.TransactionUuid, UserID: id, GuildID: 0, }) + memspiration = maxTime(memspiration, time.Unix(int64(structure.Memberships.WelcomerPro1.Until), 0)) if err != nil { println("Cannot create new welcomer pro1 membership", id, err.Error()) } else { @@ -967,11 +976,12 @@ func migrateUserData(id int64, structure UserInfo) { StartedAt: time.Unix(int64(structure.Memberships.WelcomerPro3.Until), 0).AddDate(0, -1, 0), ExpiresAt: time.Unix(int64(structure.Memberships.WelcomerPro3.Until), 0), Status: utils.If(int64(structure.Memberships.WelcomerPro3.Until) > nowUnix, int32(database.MembershipStatusActive), int32(database.MembershipStatusExpired)), - MembershipType: int32(database.MembershipTypeLegacyWelcomerPro3), + MembershipType: int32(database.MembershipTypeLegacyWelcomerPro), TransactionUuid: t.TransactionUuid, UserID: id, GuildID: 0, }) + memspiration = maxTime(memspiration, time.Unix(int64(structure.Memberships.WelcomerPro3.Until), 0)) if err != nil { println("Cannot create new welcomer pro1 membership", id, err.Error()) } else { @@ -997,11 +1007,12 @@ func migrateUserData(id int64, structure UserInfo) { StartedAt: time.Unix(int64(structure.Memberships.WelcomerPro5.Until), 0).AddDate(0, -1, 0), ExpiresAt: time.Unix(int64(structure.Memberships.WelcomerPro5.Until), 0), Status: utils.If(int64(structure.Memberships.WelcomerPro5.Until) > nowUnix, int32(database.MembershipStatusActive), int32(database.MembershipStatusExpired)), - MembershipType: int32(database.MembershipTypeLegacyWelcomerPro5), + MembershipType: int32(database.MembershipTypeLegacyWelcomerPro), TransactionUuid: t.TransactionUuid, UserID: id, GuildID: 0, }) + memspiration = maxTime(memspiration, time.Unix(int64(structure.Memberships.WelcomerPro5.Until), 0)) if err != nil { println("Cannot create new welcomer pro5 membership", id, err.Error()) } else { @@ -1027,11 +1038,12 @@ func migrateUserData(id int64, structure UserInfo) { StartedAt: time.Unix(0, 0), ExpiresAt: time.Unix(2147483647, 0), Status: int32(database.MembershipStatusActive), - MembershipType: int32(database.MembershipTypeLegacyWelcomerPro5), + MembershipType: int32(database.MembershipTypeLegacyWelcomerPro), TransactionUuid: t.TransactionUuid, UserID: id, GuildID: 0, }) + memspiration = maxTime(memspiration, time.Unix(2147483647, 0)) if err != nil { println("Cannot create new welcomer parnter membership", id, err.Error()) } else { @@ -1061,6 +1073,8 @@ func migrateUserData(id int64, structure UserInfo) { } } + println(len(transactions), len(memberships), id) + for _, sub := range structure.Memberships.Subscriptions { switch sub.Type { case "don": @@ -1071,11 +1085,13 @@ func migrateUserData(id int64, structure UserInfo) { memberships = memberships[1:] transactions = transactions[1:] + println(len(memberships), len(transactions), sub.GuildID.AsInt64(), sub.Type) + _, err := q.CreateNewMembership(ctx, database.CreateNewMembershipParams{ - StartedAt: time.Unix(0, 0), - ExpiresAt: time.Unix(2147483647, 0), + StartedAt: time.Now(), + ExpiresAt: memspiration, Status: int32(database.MembershipStatusActive), - MembershipType: int32(database.MembershipTypeLegacyCustomBackgrounds), + MembershipType: int32(database.MembershipTypeLegacyWelcomerPro), TransactionUuid: v, UserID: id, GuildID: sub.GuildID.AsInt64(), @@ -1160,9 +1176,9 @@ var ctx context.Context var client http.Client func main() { - migrateGuilds := true + migrateGuilds := false migrateUsers := true - migrateBorderwall := true + migrateBorderwall := false guildMinValue := int64(839101942046916619) userMinValue := int64(0) diff --git a/welcomer-backend/backend/routes_billing.go b/welcomer-backend/backend/routes_billing.go index 3ea951a..7fecbaf 100644 --- a/welcomer-backend/backend/routes_billing.go +++ b/welcomer-backend/backend/routes_billing.go @@ -463,11 +463,7 @@ func paymentCallback(ctx *gin.Context) { } startedAt := time.Time{} - - expiresAt := startedAt - if sku.MonthCount <= 0 { - expiresAt = startedAt.AddDate(0, utils.If(sku.MonthCount < 0, 120, sku.MonthCount), 0) - } + expiresAt := startedAt.AddDate(0, utils.If(sku.MonthCount < 0, 120, sku.MonthCount), 0) // Create a new membership for the user. _, err = queries.CreateNewMembership(backend.ctx, database.CreateNewMembershipParams{ diff --git a/welcomer-core/auth.go b/welcomer-core/auth.go index d61a20b..205493a 100644 --- a/welcomer-core/auth.go +++ b/welcomer-core/auth.go @@ -25,15 +25,11 @@ func CheckGuildMemberships(memberships []*database.GetUserMembershipsByGuildIDRo } func IsCustomBackgroundsMembership(membershipType database.MembershipType) bool { - return membershipType == database.MembershipTypeLegacyCustomBackgrounds || - membershipType == database.MembershipTypeCustomBackgrounds + return membershipType == database.MembershipTypeLegacyCustomBackgrounds || membershipType == database.MembershipTypeCustomBackgrounds } func IsWelcomerProMembership(membershipType database.MembershipType) bool { - return membershipType == database.MembershipTypeLegacyWelcomerPro1 || - membershipType == database.MembershipTypeLegacyWelcomerPro3 || - membershipType == database.MembershipTypeLegacyWelcomerPro5 || - membershipType == database.MembershipTypeWelcomerPro + return membershipType == database.MembershipTypeLegacyWelcomerPro || membershipType == database.MembershipTypeWelcomerPro } func MemberHasElevation(discordGuild discord.Guild, member discord.GuildMember) bool { diff --git a/welcomer-core/database/database.go b/welcomer-core/database/database.go index 0193c8a..c82c7a2 100644 --- a/welcomer-core/database/database.go +++ b/welcomer-core/database/database.go @@ -11,7 +11,7 @@ type ScienceGuildEventType int32 // ENUM(unknown, idle, active, expired, refunded, removed) type MembershipStatus int32 -// ENUM(unknown, legacyCustomBackgrounds, legacyWelcomerPro1, legacyWelcomerPro3, legacyWelcomerPro5, welcomerPro, customBackgrounds) +// ENUM(unknown, legacyCustomBackgrounds, legacyWelcomerPro, welcomerPro, customBackgrounds) type MembershipType int32 // ENUM(unknown, paypal, patreon, stripe) diff --git a/welcomer-core/database/database_enum.go b/welcomer-core/database/database_enum.go index 9a57450..94516e5 100644 --- a/welcomer-core/database/database_enum.go +++ b/welcomer-core/database/database_enum.go @@ -7,6 +7,7 @@ package database import ( + "errors" "fmt" ) @@ -25,6 +26,8 @@ const ( MembershipStatusRemoved ) +var ErrInvalidMembershipStatus = errors.New("not a valid MembershipStatus") + const _MembershipStatusName = "unknownidleactiveexpiredrefundedremoved" var _MembershipStatusMap = map[MembershipStatus]string{ @@ -44,6 +47,13 @@ func (x MembershipStatus) String() string { return fmt.Sprintf("MembershipStatus(%d)", x) } +// IsValid provides a quick way to determine if the typed value is +// part of the allowed enumerated values +func (x MembershipStatus) IsValid() bool { + _, ok := _MembershipStatusMap[x] + return ok +} + var _MembershipStatusValue = map[string]MembershipStatus{ _MembershipStatusName[0:7]: MembershipStatusUnknown, _MembershipStatusName[7:11]: MembershipStatusIdle, @@ -58,7 +68,7 @@ func ParseMembershipStatus(name string) (MembershipStatus, error) { if x, ok := _MembershipStatusValue[name]; ok { return x, nil } - return MembershipStatus(0), fmt.Errorf("%s is not a valid MembershipStatus", name) + return MembershipStatus(0), fmt.Errorf("%s is %w", name, ErrInvalidMembershipStatus) } // MarshalText implements the text marshaller method. @@ -82,28 +92,24 @@ const ( MembershipTypeUnknown MembershipType = iota // MembershipTypeLegacyCustomBackgrounds is a MembershipType of type LegacyCustomBackgrounds. MembershipTypeLegacyCustomBackgrounds - // MembershipTypeLegacyWelcomerPro1 is a MembershipType of type LegacyWelcomerPro1. - MembershipTypeLegacyWelcomerPro1 - // MembershipTypeLegacyWelcomerPro3 is a MembershipType of type LegacyWelcomerPro3. - MembershipTypeLegacyWelcomerPro3 - // MembershipTypeLegacyWelcomerPro5 is a MembershipType of type LegacyWelcomerPro5. - MembershipTypeLegacyWelcomerPro5 + // MembershipTypeLegacyWelcomerPro is a MembershipType of type LegacyWelcomerPro. + MembershipTypeLegacyWelcomerPro // MembershipTypeWelcomerPro is a MembershipType of type WelcomerPro. MembershipTypeWelcomerPro // MembershipTypeCustomBackgrounds is a MembershipType of type CustomBackgrounds. MembershipTypeCustomBackgrounds ) -const _MembershipTypeName = "unknownlegacyCustomBackgroundslegacyWelcomerPro1legacyWelcomerPro3legacyWelcomerPro5welcomerProcustomBackgrounds" +var ErrInvalidMembershipType = errors.New("not a valid MembershipType") + +const _MembershipTypeName = "unknownlegacyCustomBackgroundslegacyWelcomerProwelcomerProcustomBackgrounds" var _MembershipTypeMap = map[MembershipType]string{ MembershipTypeUnknown: _MembershipTypeName[0:7], MembershipTypeLegacyCustomBackgrounds: _MembershipTypeName[7:30], - MembershipTypeLegacyWelcomerPro1: _MembershipTypeName[30:48], - MembershipTypeLegacyWelcomerPro3: _MembershipTypeName[48:66], - MembershipTypeLegacyWelcomerPro5: _MembershipTypeName[66:84], - MembershipTypeWelcomerPro: _MembershipTypeName[84:95], - MembershipTypeCustomBackgrounds: _MembershipTypeName[95:112], + MembershipTypeLegacyWelcomerPro: _MembershipTypeName[30:47], + MembershipTypeWelcomerPro: _MembershipTypeName[47:58], + MembershipTypeCustomBackgrounds: _MembershipTypeName[58:75], } // String implements the Stringer interface. @@ -114,14 +120,19 @@ func (x MembershipType) String() string { return fmt.Sprintf("MembershipType(%d)", x) } +// IsValid provides a quick way to determine if the typed value is +// part of the allowed enumerated values +func (x MembershipType) IsValid() bool { + _, ok := _MembershipTypeMap[x] + return ok +} + var _MembershipTypeValue = map[string]MembershipType{ - _MembershipTypeName[0:7]: MembershipTypeUnknown, - _MembershipTypeName[7:30]: MembershipTypeLegacyCustomBackgrounds, - _MembershipTypeName[30:48]: MembershipTypeLegacyWelcomerPro1, - _MembershipTypeName[48:66]: MembershipTypeLegacyWelcomerPro3, - _MembershipTypeName[66:84]: MembershipTypeLegacyWelcomerPro5, - _MembershipTypeName[84:95]: MembershipTypeWelcomerPro, - _MembershipTypeName[95:112]: MembershipTypeCustomBackgrounds, + _MembershipTypeName[0:7]: MembershipTypeUnknown, + _MembershipTypeName[7:30]: MembershipTypeLegacyCustomBackgrounds, + _MembershipTypeName[30:47]: MembershipTypeLegacyWelcomerPro, + _MembershipTypeName[47:58]: MembershipTypeWelcomerPro, + _MembershipTypeName[58:75]: MembershipTypeCustomBackgrounds, } // ParseMembershipType attempts to convert a string to a MembershipType. @@ -129,7 +140,7 @@ func ParseMembershipType(name string) (MembershipType, error) { if x, ok := _MembershipTypeValue[name]; ok { return x, nil } - return MembershipType(0), fmt.Errorf("%s is not a valid MembershipType", name) + return MembershipType(0), fmt.Errorf("%s is %w", name, ErrInvalidMembershipType) } // MarshalText implements the text marshaller method. @@ -159,6 +170,8 @@ const ( PlatformTypeStripe ) +var ErrInvalidPlatformType = errors.New("not a valid PlatformType") + const _PlatformTypeName = "unknownpaypalpatreonstripe" var _PlatformTypeMap = map[PlatformType]string{ @@ -176,6 +189,13 @@ func (x PlatformType) String() string { return fmt.Sprintf("PlatformType(%d)", x) } +// IsValid provides a quick way to determine if the typed value is +// part of the allowed enumerated values +func (x PlatformType) IsValid() bool { + _, ok := _PlatformTypeMap[x] + return ok +} + var _PlatformTypeValue = map[string]PlatformType{ _PlatformTypeName[0:7]: PlatformTypeUnknown, _PlatformTypeName[7:13]: PlatformTypePaypal, @@ -188,7 +208,7 @@ func ParsePlatformType(name string) (PlatformType, error) { if x, ok := _PlatformTypeValue[name]; ok { return x, nil } - return PlatformType(0), fmt.Errorf("%s is not a valid PlatformType", name) + return PlatformType(0), fmt.Errorf("%s is %w", name, ErrInvalidPlatformType) } // MarshalText implements the text marshaller method. @@ -216,6 +236,8 @@ const ( ScienceEventTypeGuildLeave ) +var ErrInvalidScienceEventType = errors.New("not a valid ScienceEventType") + const _ScienceEventTypeName = "unknownguildJoinguildLeave" var _ScienceEventTypeMap = map[ScienceEventType]string{ @@ -232,6 +254,13 @@ func (x ScienceEventType) String() string { return fmt.Sprintf("ScienceEventType(%d)", x) } +// IsValid provides a quick way to determine if the typed value is +// part of the allowed enumerated values +func (x ScienceEventType) IsValid() bool { + _, ok := _ScienceEventTypeMap[x] + return ok +} + var _ScienceEventTypeValue = map[string]ScienceEventType{ _ScienceEventTypeName[0:7]: ScienceEventTypeUnknown, _ScienceEventTypeName[7:16]: ScienceEventTypeGuildJoin, @@ -243,7 +272,7 @@ func ParseScienceEventType(name string) (ScienceEventType, error) { if x, ok := _ScienceEventTypeValue[name]; ok { return x, nil } - return ScienceEventType(0), fmt.Errorf("%s is not a valid ScienceEventType", name) + return ScienceEventType(0), fmt.Errorf("%s is %w", name, ErrInvalidScienceEventType) } // MarshalText implements the text marshaller method. @@ -285,6 +314,8 @@ const ( ScienceGuildEventTypeMembershipRemoved ) +var ErrInvalidScienceGuildEventType = errors.New("not a valid ScienceGuildEventType") + const _ScienceGuildEventTypeName = "unknownuserJoinuserLeaveuserWelcomedtimeRoleGivenborderwallChallengeborderwallCompletedtempChannelCreatedmembershipReceivedmembershipRemoved" var _ScienceGuildEventTypeMap = map[ScienceGuildEventType]string{ @@ -308,6 +339,13 @@ func (x ScienceGuildEventType) String() string { return fmt.Sprintf("ScienceGuildEventType(%d)", x) } +// IsValid provides a quick way to determine if the typed value is +// part of the allowed enumerated values +func (x ScienceGuildEventType) IsValid() bool { + _, ok := _ScienceGuildEventTypeMap[x] + return ok +} + var _ScienceGuildEventTypeValue = map[string]ScienceGuildEventType{ _ScienceGuildEventTypeName[0:7]: ScienceGuildEventTypeUnknown, _ScienceGuildEventTypeName[7:15]: ScienceGuildEventTypeUserJoin, @@ -326,7 +364,7 @@ func ParseScienceGuildEventType(name string) (ScienceGuildEventType, error) { if x, ok := _ScienceGuildEventTypeValue[name]; ok { return x, nil } - return ScienceGuildEventType(0), fmt.Errorf("%s is not a valid ScienceGuildEventType", name) + return ScienceGuildEventType(0), fmt.Errorf("%s is %w", name, ErrInvalidScienceGuildEventType) } // MarshalText implements the text marshaller method. @@ -356,6 +394,8 @@ const ( TransactionStatusRefunded ) +var ErrInvalidTransactionStatus = errors.New("not a valid TransactionStatus") + const _TransactionStatusName = "unknownpendingcompletedrefunded" var _TransactionStatusMap = map[TransactionStatus]string{ @@ -373,6 +413,13 @@ func (x TransactionStatus) String() string { return fmt.Sprintf("TransactionStatus(%d)", x) } +// IsValid provides a quick way to determine if the typed value is +// part of the allowed enumerated values +func (x TransactionStatus) IsValid() bool { + _, ok := _TransactionStatusMap[x] + return ok +} + var _TransactionStatusValue = map[string]TransactionStatus{ _TransactionStatusName[0:7]: TransactionStatusUnknown, _TransactionStatusName[7:14]: TransactionStatusPending, @@ -385,7 +432,7 @@ func ParseTransactionStatus(name string) (TransactionStatus, error) { if x, ok := _TransactionStatusValue[name]; ok { return x, nil } - return TransactionStatus(0), fmt.Errorf("%s is not a valid TransactionStatus", name) + return TransactionStatus(0), fmt.Errorf("%s is %w", name, ErrInvalidTransactionStatus) } // MarshalText implements the text marshaller method. diff --git a/welcomer-core/database/database_enum_utils.go b/welcomer-core/database/database_enum_utils.go index e1ce87e..7caa0f9 100644 --- a/welcomer-core/database/database_enum_utils.go +++ b/welcomer-core/database/database_enum_utils.go @@ -25,12 +25,8 @@ func (x MembershipType) Label() string { return "Unknown" case MembershipTypeLegacyCustomBackgrounds: return "Legacy Custom Backgrounds" - case MembershipTypeLegacyWelcomerPro1: - return "Legacy Welcomer Pro 1" - case MembershipTypeLegacyWelcomerPro3: - return "Legacy Welcomer Pro 3" - case MembershipTypeLegacyWelcomerPro5: - return "Legacy Welcomer Pro 5" + case MembershipTypeLegacyWelcomerPro: + return "Legacy Welcomer Pro" case MembershipTypeWelcomerPro: return "Welcomer Pro" case MembershipTypeCustomBackgrounds: