From bce57f84b980cea2643c1d4852159372d93ac180 Mon Sep 17 00:00:00 2001 From: Vilsol Date: Sun, 22 Jun 2025 01:07:56 +0300 Subject: [PATCH 1/2] feat: remove version stability from db and business logic --- conversion/ent_to_graphql.go | 4 +- dataloader/loaders.go | 1 - db/schema/version.go | 3 - generated/conv/sml_version.go | 1 - generated/conv/version.go | 1 - generated/ent/internal/schema.go | 2 +- generated/ent/migrate/schema.go | 9 +- generated/ent/mutation.go | 56 +------- generated/ent/runtime/runtime.go | 10 +- generated/ent/version.go | 14 +- generated/ent/version/version.go | 22 ---- generated/ent/version/where.go | 31 ----- generated/ent/version_create.go | 71 ---------- generated/ent/version_update.go | 45 ------- gql/gql_utils.go | 6 - gql/resolver_mods.go | 35 +---- gql/resolver_versions.go | 1 - integrations/discord.go | 5 - .../20250621220154_drop_stability.down.sql | 2 + .../sql/20250621220154_drop_stability.up.sql | 2 + migrations/sql/atlas.sum | 123 ++++++------------ mise.lock | 5 +- mise.toml | 2 +- models/filters.go | 1 - nodes/mod.go | 60 +-------- util/db.go | 16 --- .../create_version_in_database.go | 2 - 27 files changed, 74 insertions(+), 456 deletions(-) create mode 100644 migrations/sql/20250621220154_drop_stability.down.sql create mode 100644 migrations/sql/20250621220154_drop_stability.up.sql diff --git a/conversion/ent_to_graphql.go b/conversion/ent_to_graphql.go index 29a61749..4811aee9 100644 --- a/conversion/ent_to_graphql.go +++ b/conversion/ent_to_graphql.go @@ -26,7 +26,7 @@ type SMLVersion interface { // goverter:map Edges.Targets Targets // goverter:map CreatedAt Date // goverter:map GameVersion SatisfactoryVersion | SMLSatisfactoryVersion - // goverter:ignore EngineVersion BootstrapVersion Link + // goverter:ignore EngineVersion BootstrapVersion Link Stability Convert(source *ent.Version) *generated.SMLVersion ConvertSlice(source []*ent.Version) []*generated.SMLVersion // goverter:ignore Link @@ -99,7 +99,7 @@ type Mod interface { // goverter:extend TimeToString UIntToInt Int64ToInt type Version interface { // goverter:map Edges.Targets Targets - // goverter:ignore Link Mod Dependencies SmlVersion VirustotalResults + // goverter:ignore Link Mod Dependencies SmlVersion VirustotalResults Stability Convert(source *ent.Version) *generated.Version ConvertSlice(source []*ent.Version) []*generated.Version diff --git a/dataloader/loaders.go b/dataloader/loaders.go index 4f5ae5de..a08c8b23 100644 --- a/dataloader/loaders.go +++ b/dataloader/loaders.go @@ -117,7 +117,6 @@ func Middleware() func(handlerFunc echo.HandlerFunc) echo.HandlerFunc { version.FieldChangelog, version.FieldDownloads, version.FieldKey, - version.FieldStability, version.FieldApproved, version.FieldHotness, version.FieldDenied, diff --git a/db/schema/version.go b/db/schema/version.go index 1628a801..6e930c18 100644 --- a/db/schema/version.go +++ b/db/schema/version.go @@ -5,8 +5,6 @@ import ( "entgo.io/ent/schema/edge" "entgo.io/ent/schema/field" "entgo.io/ent/schema/index" - - "github.com/satisfactorymodding/smr-api/util" ) type Version struct { @@ -30,7 +28,6 @@ func (Version) Fields() []ent.Field { field.String("changelog").Optional(), field.Uint("downloads").Default(0), field.String("key").Optional(), - field.Enum("stability").GoType(util.Stability("")).Default("release"), field.Bool("approved").Default(false), field.Uint("hotness").Default(0), field.Bool("denied").Default(false), diff --git a/generated/conv/sml_version.go b/generated/conv/sml_version.go index 0c86f03c..2c9cd9bb 100755 --- a/generated/conv/sml_version.go +++ b/generated/conv/sml_version.go @@ -18,7 +18,6 @@ func (c *SMLVersionImpl) Convert(source *ent.Version) *generated.SMLVersion { generatedSMLVersion.ID = (*source).ID generatedSMLVersion.Version = (*source).Version generatedSMLVersion.SatisfactoryVersion = conversion.SMLSatisfactoryVersion((*source).GameVersion) - generatedSMLVersion.Stability = generated.VersionStabilities((*source).Stability) if (*source).Edges.Targets != nil { generatedSMLVersion.Targets = make([]*generated.SMLVersionTarget, len((*source).Edges.Targets)) for i := 0; i < len((*source).Edges.Targets); i++ { diff --git a/generated/conv/version.go b/generated/conv/version.go index 391ae9de..6b773ea9 100755 --- a/generated/conv/version.go +++ b/generated/conv/version.go @@ -85,7 +85,6 @@ func (c *VersionImpl) Convert(source *ent.Version) *generated.Version { generatedVersion.RequiredOnRemote = (*source).RequiredOnRemote generatedVersion.Changelog = (*source).Changelog generatedVersion.Downloads = conversion.UIntToInt((*source).Downloads) - generatedVersion.Stability = generated.VersionStabilities((*source).Stability) generatedVersion.Approved = (*source).Approved generatedVersion.UpdatedAt = conversion.TimeToString((*source).UpdatedAt) generatedVersion.CreatedAt = conversion.TimeToString((*source).CreatedAt) diff --git a/generated/ent/internal/schema.go b/generated/ent/internal/schema.go index 232ecbe6..ed1e6033 100644 --- a/generated/ent/internal/schema.go +++ b/generated/ent/internal/schema.go @@ -6,4 +6,4 @@ // Package internal holds a loadable version of the latest schema. package internal -const Schema = "{\"Schema\":\"github.com/satisfactorymodding/smr-api/db/schema\",\"Package\":\"github.com/satisfactorymodding/smr-api/generated/ent\",\"Schemas\":[{\"name\":\"Announcement\",\"config\":{\"Table\":\"\"},\"fields\":[{\"name\":\"id\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_kind\":19,\"position\":{\"Index\":0,\"MixedIn\":true,\"MixinIndex\":0}},{\"name\":\"created_at\",\"type\":{\"Type\":2,\"Ident\":\"\",\"PkgPath\":\"time\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_kind\":19,\"immutable\":true,\"position\":{\"Index\":0,\"MixedIn\":true,\"MixinIndex\":1}},{\"name\":\"updated_at\",\"type\":{\"Type\":2,\"Ident\":\"\",\"PkgPath\":\"time\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_kind\":19,\"update_default\":true,\"position\":{\"Index\":1,\"MixedIn\":true,\"MixinIndex\":1}},{\"name\":\"deleted_at\",\"type\":{\"Type\":2,\"Ident\":\"\",\"PkgPath\":\"time\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"optional\":true,\"position\":{\"Index\":0,\"MixedIn\":true,\"MixinIndex\":2}},{\"name\":\"message\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"position\":{\"Index\":0,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"importance\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"position\":{\"Index\":1,\"MixedIn\":false,\"MixinIndex\":0}}],\"indexes\":[{\"fields\":[\"deleted_at\"]}],\"hooks\":[{\"Index\":0,\"MixedIn\":true,\"MixinIndex\":2}],\"interceptors\":[{\"Index\":0,\"MixedIn\":true,\"MixinIndex\":2}]},{\"name\":\"Guide\",\"config\":{\"Table\":\"\"},\"edges\":[{\"name\":\"user\",\"type\":\"User\",\"field\":\"user_id\",\"ref_name\":\"guides\",\"unique\":true,\"inverse\":true},{\"name\":\"tags\",\"type\":\"Tag\",\"through\":{\"N\":\"guide_tags\",\"T\":\"GuideTag\"}}],\"fields\":[{\"name\":\"id\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_kind\":19,\"position\":{\"Index\":0,\"MixedIn\":true,\"MixinIndex\":0}},{\"name\":\"created_at\",\"type\":{\"Type\":2,\"Ident\":\"\",\"PkgPath\":\"time\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_kind\":19,\"immutable\":true,\"position\":{\"Index\":0,\"MixedIn\":true,\"MixinIndex\":1}},{\"name\":\"updated_at\",\"type\":{\"Type\":2,\"Ident\":\"\",\"PkgPath\":\"time\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_kind\":19,\"update_default\":true,\"position\":{\"Index\":1,\"MixedIn\":true,\"MixinIndex\":1}},{\"name\":\"deleted_at\",\"type\":{\"Type\":2,\"Ident\":\"\",\"PkgPath\":\"time\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"optional\":true,\"position\":{\"Index\":0,\"MixedIn\":true,\"MixinIndex\":2}},{\"name\":\"user_id\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"optional\":true,\"position\":{\"Index\":0,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"name\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"size\":32,\"validators\":1,\"position\":{\"Index\":1,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"short_description\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"size\":128,\"validators\":1,\"position\":{\"Index\":2,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"guide\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"position\":{\"Index\":3,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"views\",\"type\":{\"Type\":12,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_value\":0,\"default_kind\":2,\"position\":{\"Index\":4,\"MixedIn\":false,\"MixinIndex\":0}}],\"indexes\":[{\"fields\":[\"deleted_at\"]}],\"hooks\":[{\"Index\":0,\"MixedIn\":true,\"MixinIndex\":2}],\"interceptors\":[{\"Index\":0,\"MixedIn\":true,\"MixinIndex\":2}]},{\"name\":\"GuideTag\",\"config\":{\"Table\":\"\"},\"edges\":[{\"name\":\"guide\",\"type\":\"Guide\",\"field\":\"guide_id\",\"unique\":true,\"required\":true},{\"name\":\"tag\",\"type\":\"Tag\",\"field\":\"tag_id\",\"unique\":true,\"required\":true}],\"fields\":[{\"name\":\"guide_id\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"position\":{\"Index\":0,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"tag_id\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"position\":{\"Index\":1,\"MixedIn\":false,\"MixinIndex\":0}}],\"annotations\":{\"Fields\":{\"ID\":[\"guide_id\",\"tag_id\"],\"StructTag\":null}}},{\"name\":\"Mod\",\"config\":{\"Table\":\"\"},\"edges\":[{\"name\":\"versions\",\"type\":\"Version\"},{\"name\":\"authors\",\"type\":\"User\",\"ref_name\":\"mods\",\"through\":{\"N\":\"user_mods\",\"T\":\"UserMod\"},\"inverse\":true},{\"name\":\"tags\",\"type\":\"Tag\",\"through\":{\"N\":\"mod_tags\",\"T\":\"ModTag\"}},{\"name\":\"dependents\",\"type\":\"Version\",\"ref_name\":\"dependencies\",\"through\":{\"N\":\"version_dependencies\",\"T\":\"VersionDependency\"},\"inverse\":true}],\"fields\":[{\"name\":\"id\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_kind\":19,\"position\":{\"Index\":0,\"MixedIn\":true,\"MixinIndex\":0}},{\"name\":\"created_at\",\"type\":{\"Type\":2,\"Ident\":\"\",\"PkgPath\":\"time\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_kind\":19,\"immutable\":true,\"position\":{\"Index\":0,\"MixedIn\":true,\"MixinIndex\":1}},{\"name\":\"updated_at\",\"type\":{\"Type\":2,\"Ident\":\"\",\"PkgPath\":\"time\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_kind\":19,\"update_default\":true,\"position\":{\"Index\":1,\"MixedIn\":true,\"MixinIndex\":1}},{\"name\":\"deleted_at\",\"type\":{\"Type\":2,\"Ident\":\"\",\"PkgPath\":\"time\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"optional\":true,\"position\":{\"Index\":0,\"MixedIn\":true,\"MixinIndex\":2}},{\"name\":\"name\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"size\":32,\"validators\":1,\"position\":{\"Index\":0,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"short_description\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"size\":128,\"validators\":1,\"position\":{\"Index\":1,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"full_description\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"position\":{\"Index\":2,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"logo\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"optional\":true,\"position\":{\"Index\":3,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"logo_thumbhash\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"optional\":true,\"position\":{\"Index\":4,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"source_url\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"optional\":true,\"position\":{\"Index\":5,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"creator_id\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"position\":{\"Index\":6,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"approved\",\"type\":{\"Type\":1,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_value\":false,\"default_kind\":1,\"position\":{\"Index\":7,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"views\",\"type\":{\"Type\":17,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_value\":0,\"default_kind\":7,\"position\":{\"Index\":8,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"hotness\",\"type\":{\"Type\":17,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_value\":0,\"default_kind\":7,\"position\":{\"Index\":9,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"popularity\",\"type\":{\"Type\":17,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_value\":0,\"default_kind\":7,\"position\":{\"Index\":10,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"downloads\",\"type\":{\"Type\":17,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_value\":0,\"default_kind\":7,\"position\":{\"Index\":11,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"denied\",\"type\":{\"Type\":1,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_value\":false,\"default_kind\":1,\"position\":{\"Index\":12,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"last_version_date\",\"type\":{\"Type\":2,\"Ident\":\"\",\"PkgPath\":\"time\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"optional\":true,\"position\":{\"Index\":13,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"mod_reference\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"size\":32,\"validators\":1,\"position\":{\"Index\":14,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"hidden\",\"type\":{\"Type\":1,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_value\":false,\"default_kind\":1,\"position\":{\"Index\":15,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"compatibility\",\"type\":{\"Type\":3,\"Ident\":\"*util.CompatibilityInfo\",\"PkgPath\":\"github.com/satisfactorymodding/smr-api/util\",\"PkgName\":\"util\",\"Nillable\":true,\"RType\":{\"Name\":\"CompatibilityInfo\",\"Ident\":\"util.CompatibilityInfo\",\"Kind\":22,\"PkgPath\":\"github.com/satisfactorymodding/smr-api/util\",\"Methods\":{}}},\"optional\":true,\"position\":{\"Index\":16,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"toggle_network_use\",\"type\":{\"Type\":1,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_value\":false,\"default_kind\":1,\"position\":{\"Index\":17,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"toggle_explicit_content\",\"type\":{\"Type\":1,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_value\":false,\"default_kind\":1,\"position\":{\"Index\":18,\"MixedIn\":false,\"MixinIndex\":0}}],\"indexes\":[{\"fields\":[\"deleted_at\"]},{\"fields\":[\"last_version_date\"]},{\"unique\":true,\"fields\":[\"mod_reference\"]}],\"hooks\":[{\"Index\":0,\"MixedIn\":true,\"MixinIndex\":2}],\"interceptors\":[{\"Index\":0,\"MixedIn\":true,\"MixinIndex\":2}]},{\"name\":\"ModTag\",\"config\":{\"Table\":\"\"},\"edges\":[{\"name\":\"mod\",\"type\":\"Mod\",\"field\":\"mod_id\",\"unique\":true,\"required\":true},{\"name\":\"tag\",\"type\":\"Tag\",\"field\":\"tag_id\",\"unique\":true,\"required\":true}],\"fields\":[{\"name\":\"mod_id\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"position\":{\"Index\":0,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"tag_id\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"position\":{\"Index\":1,\"MixedIn\":false,\"MixinIndex\":0}}],\"annotations\":{\"Fields\":{\"ID\":[\"mod_id\",\"tag_id\"],\"StructTag\":null}}},{\"name\":\"SatisfactoryVersion\",\"config\":{\"Table\":\"\"},\"fields\":[{\"name\":\"id\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_kind\":19,\"position\":{\"Index\":0,\"MixedIn\":true,\"MixinIndex\":0}},{\"name\":\"version\",\"type\":{\"Type\":12,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"unique\":true,\"position\":{\"Index\":0,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"engine_version\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"size\":16,\"default\":true,\"default_value\":\"4.26\",\"default_kind\":24,\"validators\":1,\"position\":{\"Index\":1,\"MixedIn\":false,\"MixinIndex\":0}}]},{\"name\":\"Tag\",\"config\":{\"Table\":\"\"},\"edges\":[{\"name\":\"mods\",\"type\":\"Mod\",\"ref_name\":\"tags\",\"through\":{\"N\":\"mod_tags\",\"T\":\"ModTag\"},\"inverse\":true},{\"name\":\"guides\",\"type\":\"Guide\",\"ref_name\":\"tags\",\"through\":{\"N\":\"guide_tags\",\"T\":\"GuideTag\"},\"inverse\":true}],\"fields\":[{\"name\":\"id\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_kind\":19,\"position\":{\"Index\":0,\"MixedIn\":true,\"MixinIndex\":0}},{\"name\":\"created_at\",\"type\":{\"Type\":2,\"Ident\":\"\",\"PkgPath\":\"time\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_kind\":19,\"immutable\":true,\"position\":{\"Index\":0,\"MixedIn\":true,\"MixinIndex\":1}},{\"name\":\"updated_at\",\"type\":{\"Type\":2,\"Ident\":\"\",\"PkgPath\":\"time\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_kind\":19,\"update_default\":true,\"position\":{\"Index\":1,\"MixedIn\":true,\"MixinIndex\":1}},{\"name\":\"deleted_at\",\"type\":{\"Type\":2,\"Ident\":\"\",\"PkgPath\":\"time\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"optional\":true,\"position\":{\"Index\":0,\"MixedIn\":true,\"MixinIndex\":2}},{\"name\":\"name\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"size\":24,\"unique\":true,\"validators\":1,\"position\":{\"Index\":0,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"description\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"size\":512,\"optional\":true,\"validators\":1,\"position\":{\"Index\":1,\"MixedIn\":false,\"MixinIndex\":0}}],\"indexes\":[{\"fields\":[\"deleted_at\"]}],\"hooks\":[{\"Index\":0,\"MixedIn\":true,\"MixinIndex\":2}],\"interceptors\":[{\"Index\":0,\"MixedIn\":true,\"MixinIndex\":2}]},{\"name\":\"User\",\"config\":{\"Table\":\"\"},\"edges\":[{\"name\":\"guides\",\"type\":\"Guide\"},{\"name\":\"sessions\",\"type\":\"UserSession\",\"storage_key\":{\"Table\":\"\",\"Symbols\":null,\"Columns\":[\"user_id\"]}},{\"name\":\"mods\",\"type\":\"Mod\",\"through\":{\"N\":\"user_mods\",\"T\":\"UserMod\"}},{\"name\":\"groups\",\"type\":\"UserGroup\"}],\"fields\":[{\"name\":\"id\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_kind\":19,\"position\":{\"Index\":0,\"MixedIn\":true,\"MixinIndex\":0}},{\"name\":\"created_at\",\"type\":{\"Type\":2,\"Ident\":\"\",\"PkgPath\":\"time\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_kind\":19,\"immutable\":true,\"position\":{\"Index\":0,\"MixedIn\":true,\"MixinIndex\":1}},{\"name\":\"updated_at\",\"type\":{\"Type\":2,\"Ident\":\"\",\"PkgPath\":\"time\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_kind\":19,\"update_default\":true,\"position\":{\"Index\":1,\"MixedIn\":true,\"MixinIndex\":1}},{\"name\":\"deleted_at\",\"type\":{\"Type\":2,\"Ident\":\"\",\"PkgPath\":\"time\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"optional\":true,\"position\":{\"Index\":0,\"MixedIn\":true,\"MixinIndex\":2}},{\"name\":\"email\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"size\":256,\"validators\":1,\"position\":{\"Index\":0,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"username\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"size\":32,\"validators\":1,\"position\":{\"Index\":1,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"avatar\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"optional\":true,\"position\":{\"Index\":2,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"avatar_thumbhash\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"optional\":true,\"position\":{\"Index\":3,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"joined_from\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"optional\":true,\"position\":{\"Index\":4,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"banned\",\"type\":{\"Type\":1,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_value\":false,\"default_kind\":1,\"position\":{\"Index\":5,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"rank\",\"type\":{\"Type\":12,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_value\":1,\"default_kind\":2,\"position\":{\"Index\":6,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"github_id\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"size\":16,\"optional\":true,\"validators\":1,\"position\":{\"Index\":7,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"google_id\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"size\":32,\"optional\":true,\"validators\":1,\"position\":{\"Index\":8,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"facebook_id\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"size\":128,\"optional\":true,\"validators\":1,\"position\":{\"Index\":9,\"MixedIn\":false,\"MixinIndex\":0}}],\"indexes\":[{\"fields\":[\"deleted_at\"]},{\"unique\":true,\"fields\":[\"email\"]},{\"unique\":true,\"fields\":[\"github_id\"]},{\"unique\":true,\"fields\":[\"google_id\"]},{\"unique\":true,\"fields\":[\"facebook_id\"]}],\"hooks\":[{\"Index\":0,\"MixedIn\":true,\"MixinIndex\":2}],\"interceptors\":[{\"Index\":0,\"MixedIn\":true,\"MixinIndex\":2}]},{\"name\":\"UserGroup\",\"config\":{\"Table\":\"\"},\"edges\":[{\"name\":\"user\",\"type\":\"User\",\"field\":\"user_id\",\"ref_name\":\"groups\",\"unique\":true,\"inverse\":true,\"required\":true}],\"fields\":[{\"name\":\"id\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_kind\":19,\"position\":{\"Index\":0,\"MixedIn\":true,\"MixinIndex\":0}},{\"name\":\"created_at\",\"type\":{\"Type\":2,\"Ident\":\"\",\"PkgPath\":\"time\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_kind\":19,\"immutable\":true,\"position\":{\"Index\":0,\"MixedIn\":true,\"MixinIndex\":1}},{\"name\":\"updated_at\",\"type\":{\"Type\":2,\"Ident\":\"\",\"PkgPath\":\"time\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_kind\":19,\"update_default\":true,\"position\":{\"Index\":1,\"MixedIn\":true,\"MixinIndex\":1}},{\"name\":\"deleted_at\",\"type\":{\"Type\":2,\"Ident\":\"\",\"PkgPath\":\"time\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"optional\":true,\"position\":{\"Index\":0,\"MixedIn\":true,\"MixinIndex\":2}},{\"name\":\"user_id\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"size\":14,\"validators\":1,\"position\":{\"Index\":0,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"group_id\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"size\":14,\"validators\":1,\"position\":{\"Index\":1,\"MixedIn\":false,\"MixinIndex\":0}}],\"indexes\":[{\"fields\":[\"deleted_at\"]},{\"unique\":true,\"fields\":[\"user_id\",\"group_id\"]}],\"hooks\":[{\"Index\":0,\"MixedIn\":true,\"MixinIndex\":2}],\"interceptors\":[{\"Index\":0,\"MixedIn\":true,\"MixinIndex\":2}]},{\"name\":\"UserMod\",\"config\":{\"Table\":\"\"},\"edges\":[{\"name\":\"user\",\"type\":\"User\",\"field\":\"user_id\",\"unique\":true,\"required\":true},{\"name\":\"mod\",\"type\":\"Mod\",\"field\":\"mod_id\",\"unique\":true,\"required\":true}],\"fields\":[{\"name\":\"user_id\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"position\":{\"Index\":0,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"mod_id\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"position\":{\"Index\":1,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"role\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"position\":{\"Index\":2,\"MixedIn\":false,\"MixinIndex\":0}}],\"annotations\":{\"Fields\":{\"ID\":[\"user_id\",\"mod_id\"],\"StructTag\":null}}},{\"name\":\"UserSession\",\"config\":{\"Table\":\"\"},\"edges\":[{\"name\":\"user\",\"type\":\"User\",\"ref_name\":\"sessions\",\"unique\":true,\"inverse\":true,\"required\":true}],\"fields\":[{\"name\":\"id\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_kind\":19,\"position\":{\"Index\":0,\"MixedIn\":true,\"MixinIndex\":0}},{\"name\":\"created_at\",\"type\":{\"Type\":2,\"Ident\":\"\",\"PkgPath\":\"time\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_kind\":19,\"immutable\":true,\"position\":{\"Index\":0,\"MixedIn\":true,\"MixinIndex\":1}},{\"name\":\"updated_at\",\"type\":{\"Type\":2,\"Ident\":\"\",\"PkgPath\":\"time\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_kind\":19,\"update_default\":true,\"position\":{\"Index\":1,\"MixedIn\":true,\"MixinIndex\":1}},{\"name\":\"deleted_at\",\"type\":{\"Type\":2,\"Ident\":\"\",\"PkgPath\":\"time\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"optional\":true,\"position\":{\"Index\":0,\"MixedIn\":true,\"MixinIndex\":2}},{\"name\":\"token\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"size\":512,\"validators\":1,\"position\":{\"Index\":0,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"user_agent\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"optional\":true,\"position\":{\"Index\":1,\"MixedIn\":false,\"MixinIndex\":0}}],\"indexes\":[{\"fields\":[\"deleted_at\"]},{\"unique\":true,\"fields\":[\"token\"]}],\"hooks\":[{\"Index\":0,\"MixedIn\":true,\"MixinIndex\":2}],\"interceptors\":[{\"Index\":0,\"MixedIn\":true,\"MixinIndex\":2}]},{\"name\":\"Version\",\"config\":{\"Table\":\"\"},\"edges\":[{\"name\":\"mod\",\"type\":\"Mod\",\"field\":\"mod_id\",\"ref_name\":\"versions\",\"unique\":true,\"inverse\":true,\"required\":true},{\"name\":\"dependencies\",\"type\":\"Mod\",\"through\":{\"N\":\"version_dependencies\",\"T\":\"VersionDependency\"}},{\"name\":\"targets\",\"type\":\"VersionTarget\"},{\"name\":\"virustotal_results\",\"type\":\"VirustotalResult\"}],\"fields\":[{\"name\":\"id\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_kind\":19,\"position\":{\"Index\":0,\"MixedIn\":true,\"MixinIndex\":0}},{\"name\":\"created_at\",\"type\":{\"Type\":2,\"Ident\":\"\",\"PkgPath\":\"time\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_kind\":19,\"immutable\":true,\"position\":{\"Index\":0,\"MixedIn\":true,\"MixinIndex\":1}},{\"name\":\"updated_at\",\"type\":{\"Type\":2,\"Ident\":\"\",\"PkgPath\":\"time\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_kind\":19,\"update_default\":true,\"position\":{\"Index\":1,\"MixedIn\":true,\"MixinIndex\":1}},{\"name\":\"deleted_at\",\"type\":{\"Type\":2,\"Ident\":\"\",\"PkgPath\":\"time\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"optional\":true,\"position\":{\"Index\":0,\"MixedIn\":true,\"MixinIndex\":2}},{\"name\":\"mod_id\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"position\":{\"Index\":0,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"version\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"size\":16,\"validators\":1,\"position\":{\"Index\":1,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"game_version\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"position\":{\"Index\":2,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"required_on_remote\",\"type\":{\"Type\":1,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_value\":true,\"default_kind\":1,\"position\":{\"Index\":3,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"changelog\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"optional\":true,\"position\":{\"Index\":4,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"downloads\",\"type\":{\"Type\":17,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_value\":0,\"default_kind\":7,\"position\":{\"Index\":5,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"key\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"optional\":true,\"position\":{\"Index\":6,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"stability\",\"type\":{\"Type\":6,\"Ident\":\"util.Stability\",\"PkgPath\":\"github.com/satisfactorymodding/smr-api/util\",\"PkgName\":\"util\",\"Nillable\":false,\"RType\":{\"Name\":\"Stability\",\"Ident\":\"util.Stability\",\"Kind\":24,\"PkgPath\":\"github.com/satisfactorymodding/smr-api/util\",\"Methods\":{\"Values\":{\"In\":[],\"Out\":[{\"Name\":\"\",\"Ident\":\"[]string\",\"Kind\":23,\"PkgPath\":\"\",\"Methods\":null}]}}}},\"enums\":[{\"N\":\"release\",\"V\":\"release\"},{\"N\":\"beta\",\"V\":\"beta\"},{\"N\":\"alpha\",\"V\":\"alpha\"}],\"default\":true,\"default_value\":\"release\",\"default_kind\":24,\"position\":{\"Index\":7,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"approved\",\"type\":{\"Type\":1,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_value\":false,\"default_kind\":1,\"position\":{\"Index\":8,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"hotness\",\"type\":{\"Type\":17,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_value\":0,\"default_kind\":7,\"position\":{\"Index\":9,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"denied\",\"type\":{\"Type\":1,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_value\":false,\"default_kind\":1,\"position\":{\"Index\":10,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"metadata\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"optional\":true,\"position\":{\"Index\":11,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"mod_reference\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"size\":32,\"validators\":1,\"position\":{\"Index\":12,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"version_major\",\"type\":{\"Type\":12,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"optional\":true,\"position\":{\"Index\":13,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"version_minor\",\"type\":{\"Type\":12,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"optional\":true,\"position\":{\"Index\":14,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"version_patch\",\"type\":{\"Type\":12,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"optional\":true,\"position\":{\"Index\":15,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"size\",\"type\":{\"Type\":13,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"optional\":true,\"position\":{\"Index\":16,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"hash\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"size\":64,\"optional\":true,\"validators\":2,\"position\":{\"Index\":17,\"MixedIn\":false,\"MixinIndex\":0}}],\"indexes\":[{\"fields\":[\"deleted_at\"]},{\"fields\":[\"approved\"]},{\"fields\":[\"denied\"]},{\"fields\":[\"mod_id\"]}],\"hooks\":[{\"Index\":0,\"MixedIn\":true,\"MixinIndex\":2}],\"interceptors\":[{\"Index\":0,\"MixedIn\":true,\"MixinIndex\":2}]},{\"name\":\"VersionDependency\",\"config\":{\"Table\":\"\"},\"edges\":[{\"name\":\"version\",\"type\":\"Version\",\"field\":\"version_id\",\"unique\":true,\"required\":true},{\"name\":\"mod\",\"type\":\"Mod\",\"field\":\"mod_id\",\"unique\":true,\"required\":true}],\"fields\":[{\"name\":\"created_at\",\"type\":{\"Type\":2,\"Ident\":\"\",\"PkgPath\":\"time\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_kind\":19,\"immutable\":true,\"position\":{\"Index\":0,\"MixedIn\":true,\"MixinIndex\":0}},{\"name\":\"updated_at\",\"type\":{\"Type\":2,\"Ident\":\"\",\"PkgPath\":\"time\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_kind\":19,\"update_default\":true,\"position\":{\"Index\":1,\"MixedIn\":true,\"MixinIndex\":0}},{\"name\":\"deleted_at\",\"type\":{\"Type\":2,\"Ident\":\"\",\"PkgPath\":\"time\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"optional\":true,\"position\":{\"Index\":0,\"MixedIn\":true,\"MixinIndex\":1}},{\"name\":\"version_id\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"position\":{\"Index\":0,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"mod_id\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"position\":{\"Index\":1,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"condition\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"size\":64,\"validators\":1,\"position\":{\"Index\":2,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"optional\",\"type\":{\"Type\":1,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"position\":{\"Index\":3,\"MixedIn\":false,\"MixinIndex\":0}}],\"indexes\":[{\"fields\":[\"deleted_at\"]}],\"hooks\":[{\"Index\":0,\"MixedIn\":true,\"MixinIndex\":1}],\"interceptors\":[{\"Index\":0,\"MixedIn\":true,\"MixinIndex\":1}],\"annotations\":{\"Fields\":{\"ID\":[\"version_id\",\"mod_id\"],\"StructTag\":null}}},{\"name\":\"VersionTarget\",\"config\":{\"Table\":\"\"},\"edges\":[{\"name\":\"version\",\"type\":\"Version\",\"field\":\"version_id\",\"ref_name\":\"targets\",\"unique\":true,\"inverse\":true,\"required\":true}],\"fields\":[{\"name\":\"id\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_kind\":19,\"position\":{\"Index\":0,\"MixedIn\":true,\"MixinIndex\":0}},{\"name\":\"version_id\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"position\":{\"Index\":0,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"target_name\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"position\":{\"Index\":1,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"key\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"optional\":true,\"position\":{\"Index\":2,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"hash\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"optional\":true,\"position\":{\"Index\":3,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"size\",\"type\":{\"Type\":13,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"optional\":true,\"position\":{\"Index\":4,\"MixedIn\":false,\"MixinIndex\":0}}],\"indexes\":[{\"unique\":true,\"fields\":[\"version_id\",\"target_name\"]}]},{\"name\":\"VirustotalResult\",\"config\":{\"Table\":\"\"},\"edges\":[{\"name\":\"version\",\"type\":\"Version\",\"field\":\"version_id\",\"ref_name\":\"virustotal_results\",\"unique\":true,\"inverse\":true,\"required\":true}],\"fields\":[{\"name\":\"id\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_kind\":19,\"position\":{\"Index\":0,\"MixedIn\":true,\"MixinIndex\":0}},{\"name\":\"created_at\",\"type\":{\"Type\":2,\"Ident\":\"\",\"PkgPath\":\"time\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_kind\":19,\"immutable\":true,\"position\":{\"Index\":0,\"MixedIn\":true,\"MixinIndex\":1}},{\"name\":\"updated_at\",\"type\":{\"Type\":2,\"Ident\":\"\",\"PkgPath\":\"time\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_kind\":19,\"update_default\":true,\"position\":{\"Index\":1,\"MixedIn\":true,\"MixinIndex\":1}},{\"name\":\"safe\",\"type\":{\"Type\":1,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_value\":false,\"default_kind\":1,\"position\":{\"Index\":0,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"hash\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"size\":64,\"validators\":2,\"position\":{\"Index\":1,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"file_name\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"validators\":1,\"position\":{\"Index\":2,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"version_id\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"size\":14,\"validators\":2,\"position\":{\"Index\":3,\"MixedIn\":false,\"MixinIndex\":0}}],\"indexes\":[{\"fields\":[\"safe\"]},{\"unique\":true,\"fields\":[\"hash\",\"version_id\"]},{\"fields\":[\"file_name\"]}]}],\"Features\":[\"sql/modifier\",\"intercept\",\"schema/snapshot\",\"sql/execquery\",\"sql/upsert\"]}" +const Schema = "{\"Schema\":\"github.com/satisfactorymodding/smr-api/db/schema\",\"Package\":\"github.com/satisfactorymodding/smr-api/generated/ent\",\"Schemas\":[{\"name\":\"Announcement\",\"config\":{\"Table\":\"\"},\"fields\":[{\"name\":\"id\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_kind\":19,\"position\":{\"Index\":0,\"MixedIn\":true,\"MixinIndex\":0}},{\"name\":\"created_at\",\"type\":{\"Type\":2,\"Ident\":\"\",\"PkgPath\":\"time\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_kind\":19,\"immutable\":true,\"position\":{\"Index\":0,\"MixedIn\":true,\"MixinIndex\":1}},{\"name\":\"updated_at\",\"type\":{\"Type\":2,\"Ident\":\"\",\"PkgPath\":\"time\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_kind\":19,\"update_default\":true,\"position\":{\"Index\":1,\"MixedIn\":true,\"MixinIndex\":1}},{\"name\":\"deleted_at\",\"type\":{\"Type\":2,\"Ident\":\"\",\"PkgPath\":\"time\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"optional\":true,\"position\":{\"Index\":0,\"MixedIn\":true,\"MixinIndex\":2}},{\"name\":\"message\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"position\":{\"Index\":0,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"importance\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"position\":{\"Index\":1,\"MixedIn\":false,\"MixinIndex\":0}}],\"indexes\":[{\"fields\":[\"deleted_at\"]}],\"hooks\":[{\"Index\":0,\"MixedIn\":true,\"MixinIndex\":2}],\"interceptors\":[{\"Index\":0,\"MixedIn\":true,\"MixinIndex\":2}]},{\"name\":\"Guide\",\"config\":{\"Table\":\"\"},\"edges\":[{\"name\":\"user\",\"type\":\"User\",\"field\":\"user_id\",\"ref_name\":\"guides\",\"unique\":true,\"inverse\":true},{\"name\":\"tags\",\"type\":\"Tag\",\"through\":{\"N\":\"guide_tags\",\"T\":\"GuideTag\"}}],\"fields\":[{\"name\":\"id\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_kind\":19,\"position\":{\"Index\":0,\"MixedIn\":true,\"MixinIndex\":0}},{\"name\":\"created_at\",\"type\":{\"Type\":2,\"Ident\":\"\",\"PkgPath\":\"time\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_kind\":19,\"immutable\":true,\"position\":{\"Index\":0,\"MixedIn\":true,\"MixinIndex\":1}},{\"name\":\"updated_at\",\"type\":{\"Type\":2,\"Ident\":\"\",\"PkgPath\":\"time\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_kind\":19,\"update_default\":true,\"position\":{\"Index\":1,\"MixedIn\":true,\"MixinIndex\":1}},{\"name\":\"deleted_at\",\"type\":{\"Type\":2,\"Ident\":\"\",\"PkgPath\":\"time\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"optional\":true,\"position\":{\"Index\":0,\"MixedIn\":true,\"MixinIndex\":2}},{\"name\":\"user_id\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"optional\":true,\"position\":{\"Index\":0,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"name\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"size\":32,\"validators\":1,\"position\":{\"Index\":1,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"short_description\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"size\":128,\"validators\":1,\"position\":{\"Index\":2,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"guide\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"position\":{\"Index\":3,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"views\",\"type\":{\"Type\":12,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_value\":0,\"default_kind\":2,\"position\":{\"Index\":4,\"MixedIn\":false,\"MixinIndex\":0}}],\"indexes\":[{\"fields\":[\"deleted_at\"]}],\"hooks\":[{\"Index\":0,\"MixedIn\":true,\"MixinIndex\":2}],\"interceptors\":[{\"Index\":0,\"MixedIn\":true,\"MixinIndex\":2}]},{\"name\":\"GuideTag\",\"config\":{\"Table\":\"\"},\"edges\":[{\"name\":\"guide\",\"type\":\"Guide\",\"field\":\"guide_id\",\"unique\":true,\"required\":true},{\"name\":\"tag\",\"type\":\"Tag\",\"field\":\"tag_id\",\"unique\":true,\"required\":true}],\"fields\":[{\"name\":\"guide_id\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"position\":{\"Index\":0,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"tag_id\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"position\":{\"Index\":1,\"MixedIn\":false,\"MixinIndex\":0}}],\"annotations\":{\"Fields\":{\"ID\":[\"guide_id\",\"tag_id\"],\"StructTag\":null}}},{\"name\":\"Mod\",\"config\":{\"Table\":\"\"},\"edges\":[{\"name\":\"versions\",\"type\":\"Version\"},{\"name\":\"authors\",\"type\":\"User\",\"ref_name\":\"mods\",\"through\":{\"N\":\"user_mods\",\"T\":\"UserMod\"},\"inverse\":true},{\"name\":\"tags\",\"type\":\"Tag\",\"through\":{\"N\":\"mod_tags\",\"T\":\"ModTag\"}},{\"name\":\"dependents\",\"type\":\"Version\",\"ref_name\":\"dependencies\",\"through\":{\"N\":\"version_dependencies\",\"T\":\"VersionDependency\"},\"inverse\":true}],\"fields\":[{\"name\":\"id\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_kind\":19,\"position\":{\"Index\":0,\"MixedIn\":true,\"MixinIndex\":0}},{\"name\":\"created_at\",\"type\":{\"Type\":2,\"Ident\":\"\",\"PkgPath\":\"time\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_kind\":19,\"immutable\":true,\"position\":{\"Index\":0,\"MixedIn\":true,\"MixinIndex\":1}},{\"name\":\"updated_at\",\"type\":{\"Type\":2,\"Ident\":\"\",\"PkgPath\":\"time\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_kind\":19,\"update_default\":true,\"position\":{\"Index\":1,\"MixedIn\":true,\"MixinIndex\":1}},{\"name\":\"deleted_at\",\"type\":{\"Type\":2,\"Ident\":\"\",\"PkgPath\":\"time\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"optional\":true,\"position\":{\"Index\":0,\"MixedIn\":true,\"MixinIndex\":2}},{\"name\":\"name\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"size\":32,\"validators\":1,\"position\":{\"Index\":0,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"short_description\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"size\":128,\"validators\":1,\"position\":{\"Index\":1,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"full_description\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"position\":{\"Index\":2,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"logo\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"optional\":true,\"position\":{\"Index\":3,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"logo_thumbhash\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"optional\":true,\"position\":{\"Index\":4,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"source_url\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"optional\":true,\"position\":{\"Index\":5,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"creator_id\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"position\":{\"Index\":6,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"approved\",\"type\":{\"Type\":1,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_value\":false,\"default_kind\":1,\"position\":{\"Index\":7,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"views\",\"type\":{\"Type\":17,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_value\":0,\"default_kind\":7,\"position\":{\"Index\":8,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"hotness\",\"type\":{\"Type\":17,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_value\":0,\"default_kind\":7,\"position\":{\"Index\":9,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"popularity\",\"type\":{\"Type\":17,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_value\":0,\"default_kind\":7,\"position\":{\"Index\":10,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"downloads\",\"type\":{\"Type\":17,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_value\":0,\"default_kind\":7,\"position\":{\"Index\":11,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"denied\",\"type\":{\"Type\":1,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_value\":false,\"default_kind\":1,\"position\":{\"Index\":12,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"last_version_date\",\"type\":{\"Type\":2,\"Ident\":\"\",\"PkgPath\":\"time\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"optional\":true,\"position\":{\"Index\":13,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"mod_reference\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"size\":32,\"validators\":1,\"position\":{\"Index\":14,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"hidden\",\"type\":{\"Type\":1,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_value\":false,\"default_kind\":1,\"position\":{\"Index\":15,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"compatibility\",\"type\":{\"Type\":3,\"Ident\":\"*util.CompatibilityInfo\",\"PkgPath\":\"github.com/satisfactorymodding/smr-api/util\",\"PkgName\":\"util\",\"Nillable\":true,\"RType\":{\"Name\":\"CompatibilityInfo\",\"Ident\":\"util.CompatibilityInfo\",\"Kind\":22,\"PkgPath\":\"github.com/satisfactorymodding/smr-api/util\",\"Methods\":{}}},\"optional\":true,\"position\":{\"Index\":16,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"toggle_network_use\",\"type\":{\"Type\":1,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_value\":false,\"default_kind\":1,\"position\":{\"Index\":17,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"toggle_explicit_content\",\"type\":{\"Type\":1,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_value\":false,\"default_kind\":1,\"position\":{\"Index\":18,\"MixedIn\":false,\"MixinIndex\":0}}],\"indexes\":[{\"fields\":[\"deleted_at\"]},{\"fields\":[\"last_version_date\"]},{\"unique\":true,\"fields\":[\"mod_reference\"]}],\"hooks\":[{\"Index\":0,\"MixedIn\":true,\"MixinIndex\":2}],\"interceptors\":[{\"Index\":0,\"MixedIn\":true,\"MixinIndex\":2}]},{\"name\":\"ModTag\",\"config\":{\"Table\":\"\"},\"edges\":[{\"name\":\"mod\",\"type\":\"Mod\",\"field\":\"mod_id\",\"unique\":true,\"required\":true},{\"name\":\"tag\",\"type\":\"Tag\",\"field\":\"tag_id\",\"unique\":true,\"required\":true}],\"fields\":[{\"name\":\"mod_id\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"position\":{\"Index\":0,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"tag_id\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"position\":{\"Index\":1,\"MixedIn\":false,\"MixinIndex\":0}}],\"annotations\":{\"Fields\":{\"ID\":[\"mod_id\",\"tag_id\"],\"StructTag\":null}}},{\"name\":\"SatisfactoryVersion\",\"config\":{\"Table\":\"\"},\"fields\":[{\"name\":\"id\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_kind\":19,\"position\":{\"Index\":0,\"MixedIn\":true,\"MixinIndex\":0}},{\"name\":\"version\",\"type\":{\"Type\":12,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"unique\":true,\"position\":{\"Index\":0,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"engine_version\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"size\":16,\"default\":true,\"default_value\":\"4.26\",\"default_kind\":24,\"validators\":1,\"position\":{\"Index\":1,\"MixedIn\":false,\"MixinIndex\":0}}]},{\"name\":\"Tag\",\"config\":{\"Table\":\"\"},\"edges\":[{\"name\":\"mods\",\"type\":\"Mod\",\"ref_name\":\"tags\",\"through\":{\"N\":\"mod_tags\",\"T\":\"ModTag\"},\"inverse\":true},{\"name\":\"guides\",\"type\":\"Guide\",\"ref_name\":\"tags\",\"through\":{\"N\":\"guide_tags\",\"T\":\"GuideTag\"},\"inverse\":true}],\"fields\":[{\"name\":\"id\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_kind\":19,\"position\":{\"Index\":0,\"MixedIn\":true,\"MixinIndex\":0}},{\"name\":\"created_at\",\"type\":{\"Type\":2,\"Ident\":\"\",\"PkgPath\":\"time\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_kind\":19,\"immutable\":true,\"position\":{\"Index\":0,\"MixedIn\":true,\"MixinIndex\":1}},{\"name\":\"updated_at\",\"type\":{\"Type\":2,\"Ident\":\"\",\"PkgPath\":\"time\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_kind\":19,\"update_default\":true,\"position\":{\"Index\":1,\"MixedIn\":true,\"MixinIndex\":1}},{\"name\":\"deleted_at\",\"type\":{\"Type\":2,\"Ident\":\"\",\"PkgPath\":\"time\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"optional\":true,\"position\":{\"Index\":0,\"MixedIn\":true,\"MixinIndex\":2}},{\"name\":\"name\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"size\":24,\"unique\":true,\"validators\":1,\"position\":{\"Index\":0,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"description\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"size\":512,\"optional\":true,\"validators\":1,\"position\":{\"Index\":1,\"MixedIn\":false,\"MixinIndex\":0}}],\"indexes\":[{\"fields\":[\"deleted_at\"]}],\"hooks\":[{\"Index\":0,\"MixedIn\":true,\"MixinIndex\":2}],\"interceptors\":[{\"Index\":0,\"MixedIn\":true,\"MixinIndex\":2}]},{\"name\":\"User\",\"config\":{\"Table\":\"\"},\"edges\":[{\"name\":\"guides\",\"type\":\"Guide\"},{\"name\":\"sessions\",\"type\":\"UserSession\",\"storage_key\":{\"Table\":\"\",\"Symbols\":null,\"Columns\":[\"user_id\"]}},{\"name\":\"mods\",\"type\":\"Mod\",\"through\":{\"N\":\"user_mods\",\"T\":\"UserMod\"}},{\"name\":\"groups\",\"type\":\"UserGroup\"}],\"fields\":[{\"name\":\"id\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_kind\":19,\"position\":{\"Index\":0,\"MixedIn\":true,\"MixinIndex\":0}},{\"name\":\"created_at\",\"type\":{\"Type\":2,\"Ident\":\"\",\"PkgPath\":\"time\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_kind\":19,\"immutable\":true,\"position\":{\"Index\":0,\"MixedIn\":true,\"MixinIndex\":1}},{\"name\":\"updated_at\",\"type\":{\"Type\":2,\"Ident\":\"\",\"PkgPath\":\"time\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_kind\":19,\"update_default\":true,\"position\":{\"Index\":1,\"MixedIn\":true,\"MixinIndex\":1}},{\"name\":\"deleted_at\",\"type\":{\"Type\":2,\"Ident\":\"\",\"PkgPath\":\"time\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"optional\":true,\"position\":{\"Index\":0,\"MixedIn\":true,\"MixinIndex\":2}},{\"name\":\"email\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"size\":256,\"validators\":1,\"position\":{\"Index\":0,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"username\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"size\":32,\"validators\":1,\"position\":{\"Index\":1,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"avatar\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"optional\":true,\"position\":{\"Index\":2,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"avatar_thumbhash\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"optional\":true,\"position\":{\"Index\":3,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"joined_from\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"optional\":true,\"position\":{\"Index\":4,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"banned\",\"type\":{\"Type\":1,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_value\":false,\"default_kind\":1,\"position\":{\"Index\":5,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"rank\",\"type\":{\"Type\":12,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_value\":1,\"default_kind\":2,\"position\":{\"Index\":6,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"github_id\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"size\":16,\"optional\":true,\"validators\":1,\"position\":{\"Index\":7,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"google_id\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"size\":32,\"optional\":true,\"validators\":1,\"position\":{\"Index\":8,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"facebook_id\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"size\":128,\"optional\":true,\"validators\":1,\"position\":{\"Index\":9,\"MixedIn\":false,\"MixinIndex\":0}}],\"indexes\":[{\"fields\":[\"deleted_at\"]},{\"unique\":true,\"fields\":[\"email\"]},{\"unique\":true,\"fields\":[\"github_id\"]},{\"unique\":true,\"fields\":[\"google_id\"]},{\"unique\":true,\"fields\":[\"facebook_id\"]}],\"hooks\":[{\"Index\":0,\"MixedIn\":true,\"MixinIndex\":2}],\"interceptors\":[{\"Index\":0,\"MixedIn\":true,\"MixinIndex\":2}]},{\"name\":\"UserGroup\",\"config\":{\"Table\":\"\"},\"edges\":[{\"name\":\"user\",\"type\":\"User\",\"field\":\"user_id\",\"ref_name\":\"groups\",\"unique\":true,\"inverse\":true,\"required\":true}],\"fields\":[{\"name\":\"id\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_kind\":19,\"position\":{\"Index\":0,\"MixedIn\":true,\"MixinIndex\":0}},{\"name\":\"created_at\",\"type\":{\"Type\":2,\"Ident\":\"\",\"PkgPath\":\"time\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_kind\":19,\"immutable\":true,\"position\":{\"Index\":0,\"MixedIn\":true,\"MixinIndex\":1}},{\"name\":\"updated_at\",\"type\":{\"Type\":2,\"Ident\":\"\",\"PkgPath\":\"time\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_kind\":19,\"update_default\":true,\"position\":{\"Index\":1,\"MixedIn\":true,\"MixinIndex\":1}},{\"name\":\"deleted_at\",\"type\":{\"Type\":2,\"Ident\":\"\",\"PkgPath\":\"time\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"optional\":true,\"position\":{\"Index\":0,\"MixedIn\":true,\"MixinIndex\":2}},{\"name\":\"user_id\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"size\":14,\"validators\":1,\"position\":{\"Index\":0,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"group_id\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"size\":14,\"validators\":1,\"position\":{\"Index\":1,\"MixedIn\":false,\"MixinIndex\":0}}],\"indexes\":[{\"fields\":[\"deleted_at\"]},{\"unique\":true,\"fields\":[\"user_id\",\"group_id\"]}],\"hooks\":[{\"Index\":0,\"MixedIn\":true,\"MixinIndex\":2}],\"interceptors\":[{\"Index\":0,\"MixedIn\":true,\"MixinIndex\":2}]},{\"name\":\"UserMod\",\"config\":{\"Table\":\"\"},\"edges\":[{\"name\":\"user\",\"type\":\"User\",\"field\":\"user_id\",\"unique\":true,\"required\":true},{\"name\":\"mod\",\"type\":\"Mod\",\"field\":\"mod_id\",\"unique\":true,\"required\":true}],\"fields\":[{\"name\":\"user_id\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"position\":{\"Index\":0,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"mod_id\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"position\":{\"Index\":1,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"role\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"position\":{\"Index\":2,\"MixedIn\":false,\"MixinIndex\":0}}],\"annotations\":{\"Fields\":{\"ID\":[\"user_id\",\"mod_id\"],\"StructTag\":null}}},{\"name\":\"UserSession\",\"config\":{\"Table\":\"\"},\"edges\":[{\"name\":\"user\",\"type\":\"User\",\"ref_name\":\"sessions\",\"unique\":true,\"inverse\":true,\"required\":true}],\"fields\":[{\"name\":\"id\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_kind\":19,\"position\":{\"Index\":0,\"MixedIn\":true,\"MixinIndex\":0}},{\"name\":\"created_at\",\"type\":{\"Type\":2,\"Ident\":\"\",\"PkgPath\":\"time\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_kind\":19,\"immutable\":true,\"position\":{\"Index\":0,\"MixedIn\":true,\"MixinIndex\":1}},{\"name\":\"updated_at\",\"type\":{\"Type\":2,\"Ident\":\"\",\"PkgPath\":\"time\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_kind\":19,\"update_default\":true,\"position\":{\"Index\":1,\"MixedIn\":true,\"MixinIndex\":1}},{\"name\":\"deleted_at\",\"type\":{\"Type\":2,\"Ident\":\"\",\"PkgPath\":\"time\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"optional\":true,\"position\":{\"Index\":0,\"MixedIn\":true,\"MixinIndex\":2}},{\"name\":\"token\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"size\":512,\"validators\":1,\"position\":{\"Index\":0,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"user_agent\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"optional\":true,\"position\":{\"Index\":1,\"MixedIn\":false,\"MixinIndex\":0}}],\"indexes\":[{\"fields\":[\"deleted_at\"]},{\"unique\":true,\"fields\":[\"token\"]}],\"hooks\":[{\"Index\":0,\"MixedIn\":true,\"MixinIndex\":2}],\"interceptors\":[{\"Index\":0,\"MixedIn\":true,\"MixinIndex\":2}]},{\"name\":\"Version\",\"config\":{\"Table\":\"\"},\"edges\":[{\"name\":\"mod\",\"type\":\"Mod\",\"field\":\"mod_id\",\"ref_name\":\"versions\",\"unique\":true,\"inverse\":true,\"required\":true},{\"name\":\"dependencies\",\"type\":\"Mod\",\"through\":{\"N\":\"version_dependencies\",\"T\":\"VersionDependency\"}},{\"name\":\"targets\",\"type\":\"VersionTarget\"},{\"name\":\"virustotal_results\",\"type\":\"VirustotalResult\"}],\"fields\":[{\"name\":\"id\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_kind\":19,\"position\":{\"Index\":0,\"MixedIn\":true,\"MixinIndex\":0}},{\"name\":\"created_at\",\"type\":{\"Type\":2,\"Ident\":\"\",\"PkgPath\":\"time\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_kind\":19,\"immutable\":true,\"position\":{\"Index\":0,\"MixedIn\":true,\"MixinIndex\":1}},{\"name\":\"updated_at\",\"type\":{\"Type\":2,\"Ident\":\"\",\"PkgPath\":\"time\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_kind\":19,\"update_default\":true,\"position\":{\"Index\":1,\"MixedIn\":true,\"MixinIndex\":1}},{\"name\":\"deleted_at\",\"type\":{\"Type\":2,\"Ident\":\"\",\"PkgPath\":\"time\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"optional\":true,\"position\":{\"Index\":0,\"MixedIn\":true,\"MixinIndex\":2}},{\"name\":\"mod_id\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"position\":{\"Index\":0,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"version\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"size\":16,\"validators\":1,\"position\":{\"Index\":1,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"game_version\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"position\":{\"Index\":2,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"required_on_remote\",\"type\":{\"Type\":1,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_value\":true,\"default_kind\":1,\"position\":{\"Index\":3,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"changelog\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"optional\":true,\"position\":{\"Index\":4,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"downloads\",\"type\":{\"Type\":17,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_value\":0,\"default_kind\":7,\"position\":{\"Index\":5,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"key\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"optional\":true,\"position\":{\"Index\":6,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"approved\",\"type\":{\"Type\":1,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_value\":false,\"default_kind\":1,\"position\":{\"Index\":7,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"hotness\",\"type\":{\"Type\":17,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_value\":0,\"default_kind\":7,\"position\":{\"Index\":8,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"denied\",\"type\":{\"Type\":1,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_value\":false,\"default_kind\":1,\"position\":{\"Index\":9,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"metadata\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"optional\":true,\"position\":{\"Index\":10,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"mod_reference\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"size\":32,\"validators\":1,\"position\":{\"Index\":11,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"version_major\",\"type\":{\"Type\":12,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"optional\":true,\"position\":{\"Index\":12,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"version_minor\",\"type\":{\"Type\":12,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"optional\":true,\"position\":{\"Index\":13,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"version_patch\",\"type\":{\"Type\":12,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"optional\":true,\"position\":{\"Index\":14,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"size\",\"type\":{\"Type\":13,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"optional\":true,\"position\":{\"Index\":15,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"hash\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"size\":64,\"optional\":true,\"validators\":2,\"position\":{\"Index\":16,\"MixedIn\":false,\"MixinIndex\":0}}],\"indexes\":[{\"fields\":[\"deleted_at\"]},{\"fields\":[\"approved\"]},{\"fields\":[\"denied\"]},{\"fields\":[\"mod_id\"]}],\"hooks\":[{\"Index\":0,\"MixedIn\":true,\"MixinIndex\":2}],\"interceptors\":[{\"Index\":0,\"MixedIn\":true,\"MixinIndex\":2}]},{\"name\":\"VersionDependency\",\"config\":{\"Table\":\"\"},\"edges\":[{\"name\":\"version\",\"type\":\"Version\",\"field\":\"version_id\",\"unique\":true,\"required\":true},{\"name\":\"mod\",\"type\":\"Mod\",\"field\":\"mod_id\",\"unique\":true,\"required\":true}],\"fields\":[{\"name\":\"created_at\",\"type\":{\"Type\":2,\"Ident\":\"\",\"PkgPath\":\"time\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_kind\":19,\"immutable\":true,\"position\":{\"Index\":0,\"MixedIn\":true,\"MixinIndex\":0}},{\"name\":\"updated_at\",\"type\":{\"Type\":2,\"Ident\":\"\",\"PkgPath\":\"time\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_kind\":19,\"update_default\":true,\"position\":{\"Index\":1,\"MixedIn\":true,\"MixinIndex\":0}},{\"name\":\"deleted_at\",\"type\":{\"Type\":2,\"Ident\":\"\",\"PkgPath\":\"time\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"optional\":true,\"position\":{\"Index\":0,\"MixedIn\":true,\"MixinIndex\":1}},{\"name\":\"version_id\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"position\":{\"Index\":0,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"mod_id\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"position\":{\"Index\":1,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"condition\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"size\":64,\"validators\":1,\"position\":{\"Index\":2,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"optional\",\"type\":{\"Type\":1,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"position\":{\"Index\":3,\"MixedIn\":false,\"MixinIndex\":0}}],\"indexes\":[{\"fields\":[\"deleted_at\"]}],\"hooks\":[{\"Index\":0,\"MixedIn\":true,\"MixinIndex\":1}],\"interceptors\":[{\"Index\":0,\"MixedIn\":true,\"MixinIndex\":1}],\"annotations\":{\"Fields\":{\"ID\":[\"version_id\",\"mod_id\"],\"StructTag\":null}}},{\"name\":\"VersionTarget\",\"config\":{\"Table\":\"\"},\"edges\":[{\"name\":\"version\",\"type\":\"Version\",\"field\":\"version_id\",\"ref_name\":\"targets\",\"unique\":true,\"inverse\":true,\"required\":true}],\"fields\":[{\"name\":\"id\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_kind\":19,\"position\":{\"Index\":0,\"MixedIn\":true,\"MixinIndex\":0}},{\"name\":\"version_id\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"position\":{\"Index\":0,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"target_name\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"position\":{\"Index\":1,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"key\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"optional\":true,\"position\":{\"Index\":2,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"hash\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"optional\":true,\"position\":{\"Index\":3,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"size\",\"type\":{\"Type\":13,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"optional\":true,\"position\":{\"Index\":4,\"MixedIn\":false,\"MixinIndex\":0}}],\"indexes\":[{\"unique\":true,\"fields\":[\"version_id\",\"target_name\"]}]},{\"name\":\"VirustotalResult\",\"config\":{\"Table\":\"\"},\"edges\":[{\"name\":\"version\",\"type\":\"Version\",\"field\":\"version_id\",\"ref_name\":\"virustotal_results\",\"unique\":true,\"inverse\":true,\"required\":true}],\"fields\":[{\"name\":\"id\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_kind\":19,\"position\":{\"Index\":0,\"MixedIn\":true,\"MixinIndex\":0}},{\"name\":\"created_at\",\"type\":{\"Type\":2,\"Ident\":\"\",\"PkgPath\":\"time\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_kind\":19,\"immutable\":true,\"position\":{\"Index\":0,\"MixedIn\":true,\"MixinIndex\":1}},{\"name\":\"updated_at\",\"type\":{\"Type\":2,\"Ident\":\"\",\"PkgPath\":\"time\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_kind\":19,\"update_default\":true,\"position\":{\"Index\":1,\"MixedIn\":true,\"MixinIndex\":1}},{\"name\":\"safe\",\"type\":{\"Type\":1,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"default\":true,\"default_value\":false,\"default_kind\":1,\"position\":{\"Index\":0,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"hash\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"size\":64,\"validators\":2,\"position\":{\"Index\":1,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"file_name\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"validators\":1,\"position\":{\"Index\":2,\"MixedIn\":false,\"MixinIndex\":0}},{\"name\":\"version_id\",\"type\":{\"Type\":7,\"Ident\":\"\",\"PkgPath\":\"\",\"PkgName\":\"\",\"Nillable\":false,\"RType\":null},\"size\":14,\"validators\":2,\"position\":{\"Index\":3,\"MixedIn\":false,\"MixinIndex\":0}}],\"indexes\":[{\"fields\":[\"safe\"]},{\"unique\":true,\"fields\":[\"hash\",\"version_id\"]},{\"fields\":[\"file_name\"]}]}],\"Features\":[\"sql/modifier\",\"intercept\",\"schema/snapshot\",\"sql/execquery\",\"sql/upsert\"]}" diff --git a/generated/ent/migrate/schema.go b/generated/ent/migrate/schema.go index f84c046d..5d40f3fe 100644 --- a/generated/ent/migrate/schema.go +++ b/generated/ent/migrate/schema.go @@ -355,7 +355,6 @@ var ( {Name: "changelog", Type: field.TypeString, Nullable: true}, {Name: "downloads", Type: field.TypeUint, Default: 0}, {Name: "key", Type: field.TypeString, Nullable: true}, - {Name: "stability", Type: field.TypeEnum, Enums: []string{"release", "beta", "alpha"}, Default: "release"}, {Name: "approved", Type: field.TypeBool, Default: false}, {Name: "hotness", Type: field.TypeUint, Default: 0}, {Name: "denied", Type: field.TypeBool, Default: false}, @@ -376,7 +375,7 @@ var ( ForeignKeys: []*schema.ForeignKey{ { Symbol: "versions_mods_versions", - Columns: []*schema.Column{VersionsColumns[21]}, + Columns: []*schema.Column{VersionsColumns[20]}, RefColumns: []*schema.Column{ModsColumns[0]}, OnDelete: schema.NoAction, }, @@ -390,17 +389,17 @@ var ( { Name: "version_approved", Unique: false, - Columns: []*schema.Column{VersionsColumns[11]}, + Columns: []*schema.Column{VersionsColumns[10]}, }, { Name: "version_denied", Unique: false, - Columns: []*schema.Column{VersionsColumns[13]}, + Columns: []*schema.Column{VersionsColumns[12]}, }, { Name: "version_mod_id", Unique: false, - Columns: []*schema.Column{VersionsColumns[21]}, + Columns: []*schema.Column{VersionsColumns[20]}, }, }, } diff --git a/generated/ent/mutation.go b/generated/ent/mutation.go index b74b67dd..957b4dca 100644 --- a/generated/ent/mutation.go +++ b/generated/ent/mutation.go @@ -8761,7 +8761,6 @@ type VersionMutation struct { downloads *uint adddownloads *int key *string - stability *util.Stability approved *bool hotness *uint addhotness *int @@ -9317,42 +9316,6 @@ func (m *VersionMutation) ResetKey() { delete(m.clearedFields, version.FieldKey) } -// SetStability sets the "stability" field. -func (m *VersionMutation) SetStability(u util.Stability) { - m.stability = &u -} - -// Stability returns the value of the "stability" field in the mutation. -func (m *VersionMutation) Stability() (r util.Stability, exists bool) { - v := m.stability - if v == nil { - return - } - return *v, true -} - -// OldStability returns the old "stability" field's value of the Version entity. -// If the Version object wasn't provided to the builder, the object is fetched from the database. -// An error is returned if the mutation operation is not UpdateOne, or the database query fails. -func (m *VersionMutation) OldStability(ctx context.Context) (v util.Stability, err error) { - if !m.op.Is(OpUpdateOne) { - return v, errors.New("OldStability is only allowed on UpdateOne operations") - } - if m.id == nil || m.oldValue == nil { - return v, errors.New("OldStability requires an ID field in the mutation") - } - oldValue, err := m.oldValue(ctx) - if err != nil { - return v, fmt.Errorf("querying old value for OldStability: %w", err) - } - return oldValue.Stability, nil -} - -// ResetStability resets all changes to the "stability" field. -func (m *VersionMutation) ResetStability() { - m.stability = nil -} - // SetApproved sets the "approved" field. func (m *VersionMutation) SetApproved(b bool) { m.approved = &b @@ -10118,7 +10081,7 @@ func (m *VersionMutation) Type() string { // order to get all numeric fields that were incremented/decremented, call // AddedFields(). func (m *VersionMutation) Fields() []string { - fields := make([]string, 0, 21) + fields := make([]string, 0, 20) if m.created_at != nil { fields = append(fields, version.FieldCreatedAt) } @@ -10149,9 +10112,6 @@ func (m *VersionMutation) Fields() []string { if m.key != nil { fields = append(fields, version.FieldKey) } - if m.stability != nil { - fields = append(fields, version.FieldStability) - } if m.approved != nil { fields = append(fields, version.FieldApproved) } @@ -10210,8 +10170,6 @@ func (m *VersionMutation) Field(name string) (ent.Value, bool) { return m.Downloads() case version.FieldKey: return m.Key() - case version.FieldStability: - return m.Stability() case version.FieldApproved: return m.Approved() case version.FieldHotness: @@ -10261,8 +10219,6 @@ func (m *VersionMutation) OldField(ctx context.Context, name string) (ent.Value, return m.OldDownloads(ctx) case version.FieldKey: return m.OldKey(ctx) - case version.FieldStability: - return m.OldStability(ctx) case version.FieldApproved: return m.OldApproved(ctx) case version.FieldHotness: @@ -10362,13 +10318,6 @@ func (m *VersionMutation) SetField(name string, value ent.Value) error { } m.SetKey(v) return nil - case version.FieldStability: - v, ok := value.(util.Stability) - if !ok { - return fmt.Errorf("unexpected type %T for field %s", value, name) - } - m.SetStability(v) - return nil case version.FieldApproved: v, ok := value.(bool) if !ok { @@ -10650,9 +10599,6 @@ func (m *VersionMutation) ResetField(name string) error { case version.FieldKey: m.ResetKey() return nil - case version.FieldStability: - m.ResetStability() - return nil case version.FieldApproved: m.ResetApproved() return nil diff --git a/generated/ent/runtime/runtime.go b/generated/ent/runtime/runtime.go index 2d6baa8d..0f88cf47 100644 --- a/generated/ent/runtime/runtime.go +++ b/generated/ent/runtime/runtime.go @@ -356,23 +356,23 @@ func init() { // version.DefaultDownloads holds the default value on creation for the downloads field. version.DefaultDownloads = versionDescDownloads.Default.(uint) // versionDescApproved is the schema descriptor for approved field. - versionDescApproved := versionFields[8].Descriptor() + versionDescApproved := versionFields[7].Descriptor() // version.DefaultApproved holds the default value on creation for the approved field. version.DefaultApproved = versionDescApproved.Default.(bool) // versionDescHotness is the schema descriptor for hotness field. - versionDescHotness := versionFields[9].Descriptor() + versionDescHotness := versionFields[8].Descriptor() // version.DefaultHotness holds the default value on creation for the hotness field. version.DefaultHotness = versionDescHotness.Default.(uint) // versionDescDenied is the schema descriptor for denied field. - versionDescDenied := versionFields[10].Descriptor() + versionDescDenied := versionFields[9].Descriptor() // version.DefaultDenied holds the default value on creation for the denied field. version.DefaultDenied = versionDescDenied.Default.(bool) // versionDescModReference is the schema descriptor for mod_reference field. - versionDescModReference := versionFields[12].Descriptor() + versionDescModReference := versionFields[11].Descriptor() // version.ModReferenceValidator is a validator for the "mod_reference" field. It is called by the builders before save. version.ModReferenceValidator = versionDescModReference.Validators[0].(func(string) error) // versionDescHash is the schema descriptor for hash field. - versionDescHash := versionFields[17].Descriptor() + versionDescHash := versionFields[16].Descriptor() // version.HashValidator is a validator for the "hash" field. It is called by the builders before save. version.HashValidator = func() func(string) error { validators := versionDescHash.Validators diff --git a/generated/ent/version.go b/generated/ent/version.go index 398f2383..81aea56f 100644 --- a/generated/ent/version.go +++ b/generated/ent/version.go @@ -11,7 +11,6 @@ import ( "entgo.io/ent/dialect/sql" "github.com/satisfactorymodding/smr-api/generated/ent/mod" "github.com/satisfactorymodding/smr-api/generated/ent/version" - "github.com/satisfactorymodding/smr-api/util" ) // Version is the model entity for the Version schema. @@ -39,8 +38,6 @@ type Version struct { Downloads uint `json:"downloads,omitempty"` // Key holds the value of the "key" field. Key string `json:"key,omitempty"` - // Stability holds the value of the "stability" field. - Stability util.Stability `json:"stability,omitempty"` // Approved holds the value of the "approved" field. Approved bool `json:"approved,omitempty"` // Hotness holds the value of the "hotness" field. @@ -140,7 +137,7 @@ func (*Version) scanValues(columns []string) ([]any, error) { values[i] = new(sql.NullBool) case version.FieldDownloads, version.FieldHotness, version.FieldVersionMajor, version.FieldVersionMinor, version.FieldVersionPatch, version.FieldSize: values[i] = new(sql.NullInt64) - case version.FieldID, version.FieldModID, version.FieldVersion, version.FieldGameVersion, version.FieldChangelog, version.FieldKey, version.FieldStability, version.FieldMetadata, version.FieldModReference, version.FieldHash: + case version.FieldID, version.FieldModID, version.FieldVersion, version.FieldGameVersion, version.FieldChangelog, version.FieldKey, version.FieldMetadata, version.FieldModReference, version.FieldHash: values[i] = new(sql.NullString) case version.FieldCreatedAt, version.FieldUpdatedAt, version.FieldDeletedAt: values[i] = new(sql.NullTime) @@ -225,12 +222,6 @@ func (v *Version) assignValues(columns []string, values []any) error { } else if value.Valid { v.Key = value.String } - case version.FieldStability: - if value, ok := values[i].(*sql.NullString); !ok { - return fmt.Errorf("unexpected type %T for field stability", values[i]) - } else if value.Valid { - v.Stability = util.Stability(value.String) - } case version.FieldApproved: if value, ok := values[i].(*sql.NullBool); !ok { return fmt.Errorf("unexpected type %T for field approved", values[i]) @@ -382,9 +373,6 @@ func (v *Version) String() string { builder.WriteString("key=") builder.WriteString(v.Key) builder.WriteString(", ") - builder.WriteString("stability=") - builder.WriteString(fmt.Sprintf("%v", v.Stability)) - builder.WriteString(", ") builder.WriteString("approved=") builder.WriteString(fmt.Sprintf("%v", v.Approved)) builder.WriteString(", ") diff --git a/generated/ent/version/version.go b/generated/ent/version/version.go index 1dec4296..cd51d13f 100644 --- a/generated/ent/version/version.go +++ b/generated/ent/version/version.go @@ -3,13 +3,11 @@ package version import ( - "fmt" "time" "entgo.io/ent" "entgo.io/ent/dialect/sql" "entgo.io/ent/dialect/sql/sqlgraph" - "github.com/satisfactorymodding/smr-api/util" ) const ( @@ -37,8 +35,6 @@ const ( FieldDownloads = "downloads" // FieldKey holds the string denoting the key field in the database. FieldKey = "key" - // FieldStability holds the string denoting the stability field in the database. - FieldStability = "stability" // FieldApproved holds the string denoting the approved field in the database. FieldApproved = "approved" // FieldHotness holds the string denoting the hotness field in the database. @@ -119,7 +115,6 @@ var Columns = []string{ FieldChangelog, FieldDownloads, FieldKey, - FieldStability, FieldApproved, FieldHotness, FieldDenied, @@ -182,18 +177,6 @@ var ( DefaultID func() string ) -const DefaultStability util.Stability = "release" - -// StabilityValidator is a validator for the "stability" field enum values. It is called by the builders before save. -func StabilityValidator(s util.Stability) error { - switch s { - case "release", "beta", "alpha": - return nil - default: - return fmt.Errorf("version: invalid enum value for stability field: %q", s) - } -} - // OrderOption defines the ordering options for the Version queries. type OrderOption func(*sql.Selector) @@ -252,11 +235,6 @@ func ByKey(opts ...sql.OrderTermOption) OrderOption { return sql.OrderByField(FieldKey, opts...).ToFunc() } -// ByStability orders the results by the stability field. -func ByStability(opts ...sql.OrderTermOption) OrderOption { - return sql.OrderByField(FieldStability, opts...).ToFunc() -} - // ByApproved orders the results by the approved field. func ByApproved(opts ...sql.OrderTermOption) OrderOption { return sql.OrderByField(FieldApproved, opts...).ToFunc() diff --git a/generated/ent/version/where.go b/generated/ent/version/where.go index 72687ac9..60da4c4a 100644 --- a/generated/ent/version/where.go +++ b/generated/ent/version/where.go @@ -8,7 +8,6 @@ import ( "entgo.io/ent/dialect/sql" "entgo.io/ent/dialect/sql/sqlgraph" "github.com/satisfactorymodding/smr-api/generated/ent/predicate" - "github.com/satisfactorymodding/smr-api/util" ) // ID filters vertices based on their ID field. @@ -691,36 +690,6 @@ func KeyContainsFold(v string) predicate.Version { return predicate.Version(sql.FieldContainsFold(FieldKey, v)) } -// StabilityEQ applies the EQ predicate on the "stability" field. -func StabilityEQ(v util.Stability) predicate.Version { - vc := v - return predicate.Version(sql.FieldEQ(FieldStability, vc)) -} - -// StabilityNEQ applies the NEQ predicate on the "stability" field. -func StabilityNEQ(v util.Stability) predicate.Version { - vc := v - return predicate.Version(sql.FieldNEQ(FieldStability, vc)) -} - -// StabilityIn applies the In predicate on the "stability" field. -func StabilityIn(vs ...util.Stability) predicate.Version { - v := make([]any, len(vs)) - for i := range v { - v[i] = vs[i] - } - return predicate.Version(sql.FieldIn(FieldStability, v...)) -} - -// StabilityNotIn applies the NotIn predicate on the "stability" field. -func StabilityNotIn(vs ...util.Stability) predicate.Version { - v := make([]any, len(vs)) - for i := range v { - v[i] = vs[i] - } - return predicate.Version(sql.FieldNotIn(FieldStability, v...)) -} - // ApprovedEQ applies the EQ predicate on the "approved" field. func ApprovedEQ(v bool) predicate.Version { return predicate.Version(sql.FieldEQ(FieldApproved, v)) diff --git a/generated/ent/version_create.go b/generated/ent/version_create.go index b9076e56..f8916a33 100644 --- a/generated/ent/version_create.go +++ b/generated/ent/version_create.go @@ -16,7 +16,6 @@ import ( "github.com/satisfactorymodding/smr-api/generated/ent/version" "github.com/satisfactorymodding/smr-api/generated/ent/versiontarget" "github.com/satisfactorymodding/smr-api/generated/ent/virustotalresult" - "github.com/satisfactorymodding/smr-api/util" ) // VersionCreate is the builder for creating a Version entity. @@ -143,20 +142,6 @@ func (vc *VersionCreate) SetNillableKey(s *string) *VersionCreate { return vc } -// SetStability sets the "stability" field. -func (vc *VersionCreate) SetStability(u util.Stability) *VersionCreate { - vc.mutation.SetStability(u) - return vc -} - -// SetNillableStability sets the "stability" field if the given value is not nil. -func (vc *VersionCreate) SetNillableStability(u *util.Stability) *VersionCreate { - if u != nil { - vc.SetStability(*u) - } - return vc -} - // SetApproved sets the "approved" field. func (vc *VersionCreate) SetApproved(b bool) *VersionCreate { vc.mutation.SetApproved(b) @@ -412,10 +397,6 @@ func (vc *VersionCreate) defaults() error { v := version.DefaultDownloads vc.mutation.SetDownloads(v) } - if _, ok := vc.mutation.Stability(); !ok { - v := version.DefaultStability - vc.mutation.SetStability(v) - } if _, ok := vc.mutation.Approved(); !ok { v := version.DefaultApproved vc.mutation.SetApproved(v) @@ -466,14 +447,6 @@ func (vc *VersionCreate) check() error { if _, ok := vc.mutation.Downloads(); !ok { return &ValidationError{Name: "downloads", err: errors.New(`ent: missing required field "Version.downloads"`)} } - if _, ok := vc.mutation.Stability(); !ok { - return &ValidationError{Name: "stability", err: errors.New(`ent: missing required field "Version.stability"`)} - } - if v, ok := vc.mutation.Stability(); ok { - if err := version.StabilityValidator(v); err != nil { - return &ValidationError{Name: "stability", err: fmt.Errorf(`ent: validator failed for field "Version.stability": %w`, err)} - } - } if _, ok := vc.mutation.Approved(); !ok { return &ValidationError{Name: "approved", err: errors.New(`ent: missing required field "Version.approved"`)} } @@ -571,10 +544,6 @@ func (vc *VersionCreate) createSpec() (*Version, *sqlgraph.CreateSpec) { _spec.SetField(version.FieldKey, field.TypeString, value) _node.Key = value } - if value, ok := vc.mutation.Stability(); ok { - _spec.SetField(version.FieldStability, field.TypeEnum, value) - _node.Stability = value - } if value, ok := vc.mutation.Approved(); ok { _spec.SetField(version.FieldApproved, field.TypeBool, value) _node.Approved = value @@ -868,18 +837,6 @@ func (u *VersionUpsert) ClearKey() *VersionUpsert { return u } -// SetStability sets the "stability" field. -func (u *VersionUpsert) SetStability(v util.Stability) *VersionUpsert { - u.Set(version.FieldStability, v) - return u -} - -// UpdateStability sets the "stability" field to the value that was provided on create. -func (u *VersionUpsert) UpdateStability() *VersionUpsert { - u.SetExcluded(version.FieldStability) - return u -} - // SetApproved sets the "approved" field. func (u *VersionUpsert) SetApproved(v bool) *VersionUpsert { u.Set(version.FieldApproved, v) @@ -1271,20 +1228,6 @@ func (u *VersionUpsertOne) ClearKey() *VersionUpsertOne { }) } -// SetStability sets the "stability" field. -func (u *VersionUpsertOne) SetStability(v util.Stability) *VersionUpsertOne { - return u.Update(func(s *VersionUpsert) { - s.SetStability(v) - }) -} - -// UpdateStability sets the "stability" field to the value that was provided on create. -func (u *VersionUpsertOne) UpdateStability() *VersionUpsertOne { - return u.Update(func(s *VersionUpsert) { - s.UpdateStability() - }) -} - // SetApproved sets the "approved" field. func (u *VersionUpsertOne) SetApproved(v bool) *VersionUpsertOne { return u.Update(func(s *VersionUpsert) { @@ -1874,20 +1817,6 @@ func (u *VersionUpsertBulk) ClearKey() *VersionUpsertBulk { }) } -// SetStability sets the "stability" field. -func (u *VersionUpsertBulk) SetStability(v util.Stability) *VersionUpsertBulk { - return u.Update(func(s *VersionUpsert) { - s.SetStability(v) - }) -} - -// UpdateStability sets the "stability" field to the value that was provided on create. -func (u *VersionUpsertBulk) UpdateStability() *VersionUpsertBulk { - return u.Update(func(s *VersionUpsert) { - s.UpdateStability() - }) -} - // SetApproved sets the "approved" field. func (u *VersionUpsertBulk) SetApproved(v bool) *VersionUpsertBulk { return u.Update(func(s *VersionUpsert) { diff --git a/generated/ent/version_update.go b/generated/ent/version_update.go index 1eb41b44..e1244261 100644 --- a/generated/ent/version_update.go +++ b/generated/ent/version_update.go @@ -16,7 +16,6 @@ import ( "github.com/satisfactorymodding/smr-api/generated/ent/version" "github.com/satisfactorymodding/smr-api/generated/ent/versiontarget" "github.com/satisfactorymodding/smr-api/generated/ent/virustotalresult" - "github.com/satisfactorymodding/smr-api/util" ) // VersionUpdate is the builder for updating Version entities. @@ -176,20 +175,6 @@ func (vu *VersionUpdate) ClearKey() *VersionUpdate { return vu } -// SetStability sets the "stability" field. -func (vu *VersionUpdate) SetStability(u util.Stability) *VersionUpdate { - vu.mutation.SetStability(u) - return vu -} - -// SetNillableStability sets the "stability" field if the given value is not nil. -func (vu *VersionUpdate) SetNillableStability(u *util.Stability) *VersionUpdate { - if u != nil { - vu.SetStability(*u) - } - return vu -} - // SetApproved sets the "approved" field. func (vu *VersionUpdate) SetApproved(b bool) *VersionUpdate { vu.mutation.SetApproved(b) @@ -574,11 +559,6 @@ func (vu *VersionUpdate) check() error { return &ValidationError{Name: "version", err: fmt.Errorf(`ent: validator failed for field "Version.version": %w`, err)} } } - if v, ok := vu.mutation.Stability(); ok { - if err := version.StabilityValidator(v); err != nil { - return &ValidationError{Name: "stability", err: fmt.Errorf(`ent: validator failed for field "Version.stability": %w`, err)} - } - } if v, ok := vu.mutation.ModReference(); ok { if err := version.ModReferenceValidator(v); err != nil { return &ValidationError{Name: "mod_reference", err: fmt.Errorf(`ent: validator failed for field "Version.mod_reference": %w`, err)} @@ -649,9 +629,6 @@ func (vu *VersionUpdate) sqlSave(ctx context.Context) (n int, err error) { if vu.mutation.KeyCleared() { _spec.ClearField(version.FieldKey, field.TypeString) } - if value, ok := vu.mutation.Stability(); ok { - _spec.SetField(version.FieldStability, field.TypeEnum, value) - } if value, ok := vu.mutation.Approved(); ok { _spec.SetField(version.FieldApproved, field.TypeBool, value) } @@ -1056,20 +1033,6 @@ func (vuo *VersionUpdateOne) ClearKey() *VersionUpdateOne { return vuo } -// SetStability sets the "stability" field. -func (vuo *VersionUpdateOne) SetStability(u util.Stability) *VersionUpdateOne { - vuo.mutation.SetStability(u) - return vuo -} - -// SetNillableStability sets the "stability" field if the given value is not nil. -func (vuo *VersionUpdateOne) SetNillableStability(u *util.Stability) *VersionUpdateOne { - if u != nil { - vuo.SetStability(*u) - } - return vuo -} - // SetApproved sets the "approved" field. func (vuo *VersionUpdateOne) SetApproved(b bool) *VersionUpdateOne { vuo.mutation.SetApproved(b) @@ -1467,11 +1430,6 @@ func (vuo *VersionUpdateOne) check() error { return &ValidationError{Name: "version", err: fmt.Errorf(`ent: validator failed for field "Version.version": %w`, err)} } } - if v, ok := vuo.mutation.Stability(); ok { - if err := version.StabilityValidator(v); err != nil { - return &ValidationError{Name: "stability", err: fmt.Errorf(`ent: validator failed for field "Version.stability": %w`, err)} - } - } if v, ok := vuo.mutation.ModReference(); ok { if err := version.ModReferenceValidator(v); err != nil { return &ValidationError{Name: "mod_reference", err: fmt.Errorf(`ent: validator failed for field "Version.mod_reference": %w`, err)} @@ -1559,9 +1517,6 @@ func (vuo *VersionUpdateOne) sqlSave(ctx context.Context) (_node *Version, err e if vuo.mutation.KeyCleared() { _spec.ClearField(version.FieldKey, field.TypeString) } - if value, ok := vuo.mutation.Stability(); ok { - _spec.SetField(version.FieldStability, field.TypeEnum, value) - } if value, ok := vuo.mutation.Approved(); ok { _spec.SetField(version.FieldApproved, field.TypeBool, value) } diff --git a/gql/gql_utils.go b/gql/gql_utils.go index 925f293f..289609a2 100644 --- a/gql/gql_utils.go +++ b/gql/gql_utils.go @@ -39,12 +39,6 @@ func SetINNOEF[T comparable, B any](value *T, target func(T) B) { } } -func SetStabilityINNF[B any](value *generated.VersionStabilities, target func(util.Stability) B) { - if value != nil { - target(util.Stability(*value)) - } -} - func SetDateINNF[B any](value *string, target func(time.Time) B) { if value != nil { t, _ := time.Parse(time.RFC3339Nano, *value) diff --git a/gql/resolver_mods.go b/gql/resolver_mods.go index 729638be..d7aabc27 100644 --- a/gql/resolver_mods.go +++ b/gql/resolver_mods.go @@ -607,39 +607,10 @@ func (r *modResolver) Versions(ctx context.Context, obj *generated.Mod, filter m return (*conv.VersionImpl)(nil).ConvertSlice(versions), nil } -func (r *modResolver) LatestVersions(ctx context.Context, obj *generated.Mod) (*generated.LatestVersions, error) { - versions, err := db.From(ctx).Version. - Query(). - WithTargets(). - Where( - version.ModID(obj.ID), - version.Approved(true), - version.Denied(false), - ). - Order( - version.ByModID(), - version.ByStability(), - version.ByCreatedAt(sql.OrderDesc()), - ). - Modify(func(s *sql.Selector) { - s.SelectExpr(sql.Expr("DISTINCT on (mod_id, stability) *")) - }). - All(ctx) - if err != nil { - return nil, err - } - +func (r *modResolver) LatestVersions(_ context.Context, _ *generated.Mod) (*generated.LatestVersions, error) { + // Note: Stability system has been removed. Returning empty objects for API compatibility. + // TODO: Remove this once clients are updated to not use stability-based queries. converted := generated.LatestVersions{} - for _, v := range versions { - switch v.Stability { - case util.StabilityAlpha: - converted.Alpha = (*conv.VersionImpl)(nil).Convert(v) - case util.StabilityBeta: - converted.Beta = (*conv.VersionImpl)(nil).Convert(v) - case util.StabilityRelease: - converted.Release = (*conv.VersionImpl)(nil).Convert(v) - } - } return &converted, nil } diff --git a/gql/resolver_versions.go b/gql/resolver_versions.go index db94f86a..3f83107d 100644 --- a/gql/resolver_versions.go +++ b/gql/resolver_versions.go @@ -141,7 +141,6 @@ func (r *mutationResolver) UpdateVersion(ctx context.Context, versionID string, update := dbVersion.Update() SetINNOEF(version.Changelog, update.SetChangelog) - SetStabilityINNF(version.Stability, update.SetStability) dbVersion, err := update.Save(ctx) if err != nil { diff --git a/integrations/discord.go b/integrations/discord.go index fae0e752..e0e57e9c 100644 --- a/integrations/discord.go +++ b/integrations/discord.go @@ -131,11 +131,6 @@ func NewVersion(ctx context.Context, version *ent.Version) { "value": version.Version, "inline": true, }, - map[string]interface{}{ - "name": "Stability", - "value": version.Stability, - "inline": true, - }, }, "footer": map[string]interface{}{ "text": description, diff --git a/migrations/sql/20250621220154_drop_stability.down.sql b/migrations/sql/20250621220154_drop_stability.down.sql new file mode 100644 index 00000000..02a3d751 --- /dev/null +++ b/migrations/sql/20250621220154_drop_stability.down.sql @@ -0,0 +1,2 @@ +-- reverse: modify "versions" table +ALTER TABLE "versions" ADD COLUMN "stability" character varying NOT NULL DEFAULT 'release'; diff --git a/migrations/sql/20250621220154_drop_stability.up.sql b/migrations/sql/20250621220154_drop_stability.up.sql new file mode 100644 index 00000000..1e57756b --- /dev/null +++ b/migrations/sql/20250621220154_drop_stability.up.sql @@ -0,0 +1,2 @@ +-- modify "versions" table +ALTER TABLE "versions" DROP COLUMN "stability"; diff --git a/migrations/sql/atlas.sum b/migrations/sql/atlas.sum index e9b312c3..fa0c7781 100644 --- a/migrations/sql/atlas.sum +++ b/migrations/sql/atlas.sum @@ -1,81 +1,42 @@ -h1:NVXwUmNMPEOBFBSqgQGuw/OMarJOpSsxkE/8o1qQH3k= -000001_create_initial_tables.down.sql h1:QcXXwE8ir3PM3vZjQfBihY55WiuLYjN8pbbk/L6U+bs= -000001_create_initial_tables.up.sql h1:EfAqETefs7TW9BDVS4ukiB7wUFs+HQzVdc3qHhdAFd4= -000002_create_user_group_table.down.sql h1:uJjRbQ3H7yvPGNXLD5iSPmderEoWhCNGdsqN8yqBIRY= -000002_create_user_group_table.up.sql h1:vv+FICnFttPJjETbbP3zC20qjeaoD22GsTIhbiqAabI= -000003_add_last_version_date_mod_table.down.sql h1:7XgG/ar7HtfaelfZqAUay9tbGNuE9Zpr8HCXy43Bzho= -000003_add_last_version_date_mod_table.up.sql h1:XS+Wq0PxMje4FspHU0Vf+XMmRPUaNzlzUf2LwBaMJ44= -000004_add_more_oauth_options.down.sql h1:Nh6jm45ZwD5ILB9hD53n3E0FGJBJYiDcgeqKDNa2VEs= -000004_add_more_oauth_options.up.sql h1:1AEKJpNonhN2foWAQy3XEZ7o7Uzz/3VSlSp/HCx2syA= -000005_create_user_group_table.down.sql h1:eT2Sxdjl5PbCEYI2V+iS+ZWqOzBZmX8P022kuYSk8ys= -000005_create_user_group_table.up.sql h1:WiSmqlhOxkcjpe17HaoyHNgIm6R3ZjmDu3JcAig2qww= -000006_sml_versions_table.down.sql h1:9dF9n2s+VTs19tBIF2a/1j8fxmPPR9DACt+3AjFIWj4= -000006_sml_versions_table.up.sql h1:q5mTTHw6XUuHeEGwAQwTbU4XD99j34AiX+D4jL+OZhg= -000007_relationships.down.sql h1:RQK9FsUwEQpH/R1P8lDd1Kj5Qn9K2b7FSSI0kc9fv68= -000007_relationships.up.sql h1:1ssg/HrReOUFJ3fJT64ZUfJyNmn7iCKXNMOdPMEPUv8= -000008_version_dependencies.down.sql h1:lC7lLTXlHMcfHk0o9zdqVnPBwEN65jPziIRjhj69UMQ= -000008_version_dependencies.up.sql h1:tKOBn8Ce6V0ycMDCzGPtscaVElc0Lum4a8uXW9omYlw= -000009_bootstrap_versions_table.down.sql h1:w0K92Mbw7AXU56U5wJVeNE2GvftvQVIeITV2pvIjFCI= -000009_bootstrap_versions_table.up.sql h1:ERPrO2NWBqs6q2ttKNaI0rid3jYKZj6qR913jwzrlYg= -000010_add_version_dependency_optional.down.sql h1:y7DGX+fLPcd/YTHOSHkPleglQDxrNSoeDHwPLQHLMh0= -000010_add_version_dependency_optional.up.sql h1:YjPoFnJhBKD2fnGFhOFtfGEvC6eyXYAsUxsSlnAsDz4= -000011_add_mod_reference.down.sql h1:nr8I6DoIUWPuRDysXh6sOkfC3HpLm/a6UVCLrf0xPMc= -000011_add_mod_reference.up.sql h1:KZS/NMJoWieGP1jtJC51i/lF2a4jOiUWasQibCJ8p9o= -000012_add_version_metadata.down.sql h1:zCNOV0MM5mf636RYhQ7Yz9GKmB+OZ18DnWaIa1ENq5s= -000012_add_version_metadata.up.sql h1:tsd7mN8319cn7XGsdgCmVourq4jhbmuZ/Uapsu9rjJ8= -000013_add_version_mod_reference.down.sql h1:qUmWSHyAGz9AT/Jt2llZnVFADYN1hhgzLYwwuMiMKKo= -000013_add_version_mod_reference.up.sql h1:d65ZVSgh92pwIDrMIwGGJZ6v5fux7AQsrQr8G40iADk= -000014_add_version_split_hidden.down.sql h1:iZcK2FjO+I+xOYWYVF4BJ7ukmBGO0jPGlai2rgOH2P8= -000014_add_version_split_hidden.up.sql h1:3oVTcZfJBy4Fhl6rbD85VGRWKExxHb4ax3hYGbPpkY0= -000015_enable_trgm.down.sql h1:AJJmClZ48VYAJS+Q2rLrPlmIFWktOJInnqrh8SfUrn0= -000015_enable_trgm.up.sql h1:BuogUZkedrKpWLCyX+mtPJrK07tRRAvd30cBUq7T70k= -000016_add_user_groups_dates.down.sql h1:WuPC7OtC0GWeczc2J9ikGGjgnjeqY17iorFBe0tfHZg= -000016_add_user_groups_dates.up.sql h1:KEqV3mtM7RLoBJLxnW++X8dMK16ptMN6Iy/T0QLJZLE= -000017_add_version_indexes.down.sql h1:KiSzz+mDVeHRnUy43t9MdVAC84iXHan64sZNk18+Q/8= -000017_add_version_indexes.up.sql h1:7TqNLBwA+fRodGwo7mQjWm70kEa7yCzhN40WwAvWLE0= -000018_add_announcements.down.sql h1:deFRIsA9cNi5yPqRdzKk/5MvUsSPl8b7HUQnfhBZJvM= -000018_add_announcements.up.sql h1:RD9TFmGFPMiJW19jNwXJ9XjfoNtNcw4blzaLS3Rrvow= -000019_add_tags.down.sql h1:CStsWh+638pZQbFbEEwZoWC+XF5S/xHSJSjzdhP9ybU= -000019_add_tags.up.sql h1:18KalrGuJNFDjFmVlXRGNsEm768VymvCFzvNB0KKtB8= -000020_add_compatibility.down.sql h1:4v6wWre9XOs+z140mpTDuRueHb/6iOcS0ezn/LHf13o= -000020_add_compatibility.up.sql h1:XgJ1a1joBZtLnoVNt24FfmXrYXn0d8iZa61kJ4EvmZ0= -000021_add_mod_platform.down.sql h1:vtA2qkHxQfc+fHlvJ8KXjk4K0rVG4MPTopP1TSMbiPY= -000021_add_mod_platform.up.sql h1:mj/TKRTjPcpmyQdIasBteHe36JkLfrVphsyw9yZTApI= -000022_update_mod_targets.down.sql h1:CP8p7mS9QaWacjBS8CAUaT4Cy7/qWjMt7wBbVq1qjJI= -000022_update_mod_targets.up.sql h1:gUZTxiHhZ7taXyV+C3188GnmeBI/uI7uBqjD41UgQEs= -000023_migrate_versions_to_targets.down.sql h1:VInDE7go02NuOl82UHeibzgZJqxPhWgmvH5fylAWJTE= -000023_migrate_versions_to_targets.up.sql h1:vdqjCswMAe+rma9iHtXbFSQu9lD13TiXIRMYpDhmm1M= -000024_add_sml_engine_version.down.sql h1:2v4S22nL7rL6lCeqLijs62srTmhm+1bHvpbpercu+U4= -000024_add_sml_engine_version.up.sql h1:FOidt1bZzyltMGmZfQVbe+4uqU2l2C8RosedCZ8DN7o= -000025_add_tag_description.down.sql h1:UYOx8SSsOukHsbDJZWLoyeDkJk+2PwbqG07txsQ3N+Y= -000025_add_tag_description.up.sql h1:f5KICtSygQSqt6T1zwvskLGEN4IQ3LoUh+a9dMEHySU= -000026_add_rng.down.sql h1:gNRv048A3SjY4QpUfBB7Jssc0yye634QMBEIH/Yxo5E= -000026_add_rng.up.sql h1:UfiORAolITEGUqaiieZUbLo4ym9ucLD9j/13XsTHw0U= -000027_add_id_columns.down.sql h1:evCZZoTTRe7D6actv9T6RnMmmsa/H/mx+iuW+peFpiw= -000027_add_id_columns.up.sql h1:FLIEmyz5jO+QPCBGb/DNSW6QWTIgVUHb7CY712IFBZ4= -000028_increase_token_length_limit.down.sql h1:4AiEPXj1XVBAZs1DReN+sBOkDdAZye15yIVNKAg/KC4= -000028_increase_token_length_limit.up.sql h1:j8x0A/MQf/Sqv0ZqULcn3AMbQkH632EW7YfzlSIeezA= -000029_sml_as_mod.down.sql h1:+OMz5BAnf/sjjO6hcnWagU2OXmabMHYMXwHmSlZk2rg= -000029_sml_as_mod.up.sql h1:LjCzX2ua9e0QmxCsYL9Yj7Rf8toWut6KdbR32ROraU0= -000030_db_normalization.down.sql h1:eHNIHjteGV6/BRywsJoV/WNQS3EVl9KISGRCjgP4XAA= -000030_db_normalization.up.sql h1:siSIt2HFybFyxqzFNw/V12GSf58Id6aBcLnT5eg0YXs= -20240705180551_initial_transfer_to_atlas.down.sql h1:naUs2XWGUoYRCxS59USK+Ic6AolQnLX3BMPUHdxBUL8= -20240705180551_initial_transfer_to_atlas.up.sql h1:x51llUVQXurUJEu3S6QckS4S3FBPhrSCoTK5ay/okG8= -20240815141045_drop_version_stability_enum.down.sql h1:goFiSI0l6xzq5MSB0z7gH1pLWH/DxdqNtUU8tW5ff5g= -20240815141045_drop_version_stability_enum.up.sql h1:vPGVKylyRRIvaQwdlOtAdn6M6rpA2HrXxLXRf2aDO4Q= -20240818235330_index_fixes.down.sql h1:RbMhIdLIODCHYHWp/WxFpVBcmwKYedsudaVAuYHX+zY= -20240818235330_index_fixes.up.sql h1:xTw9pSSWkMcjZeIC+npdWT2nk+bvcjVMHHvyB2cDz5g= -20240819092347_user_indexes.down.sql h1:a+LhZ3NoCFBFWrBDcZAKjh8szFZsKWSLFd9LfsoDWbs= -20240819092347_user_indexes.up.sql h1:Ei9ma1Kd/88nB4QOKmSfjz+gSs/sW1rB7LM3+3bY71s= -20240823233610_add_mod_toggles.down.sql h1:6M1jiInRvHFBMTj2+NRdipO/z5oyn7qBYt4EIOTIqXg= -20240823233610_add_mod_toggles.up.sql h1:GuKMUrlGo1PppjX0uiw3OTyi2nziRI+o/LVtWfcjyLc= -20240826153722_add_thumbhash.down.sql h1:FN73gi6XvAkodHxFuE4oDU73FfchoyonlyroQTrwCW0= -20240826153722_add_thumbhash.up.sql h1:7a9d40zpOnKMamxW14ql3WFXiwXD4O6AjwMlAOVE7ik= -20240930114249_add_required_on_remote.down.sql h1:cbW5+35gg4R78zsjcqPO94e8X1QcYB9nPllGgtKGOr8= -20240930114249_add_required_on_remote.up.sql h1:NZJmXjtKEIHRhVlSSu9nKADo/8xhZAeckrf6NoZMmjk= -20241002191358_state_fix.down.sql h1:EnNOr58ajtIPS7BIgA6l60Jr8hE0ufCE6t0zFdvfnaw= -20241002191358_state_fix.up.sql h1:4bVw9fxEP9MrHBSYuRF3vFCgaWF79EUeacD3e+vSQR4= -20241003161005_create_virustotal_results_table.down.sql h1:BPUQ6UnWq6Inwz2GhZLoy4/QghPhClf1PlfZHis92P4= -20241003161005_create_virustotal_results_table.up.sql h1:mXMWj998hZ59bbkZYIbbyxU9foptzWuXHnlS2UuY4bY= -20241008092121_nullable_mod_logo.down.sql h1:vKZrz/FqaaQctvzrTR0EvQcyQ6ENWgTbcud7q2/NvnY= -20241008092121_nullable_mod_logo.up.sql h1:7ePponYitScS4NnMP+hRoEAKnvPPpbCHXMxilYzfmD8= +h1:FKv/ZXrDCSmpEkds0WggKz/jWb6FePmNJlTwIH9p4OI= +000001_create_initial_tables.up.sql h1:D0NgABAZGONTBH9/T9MFCYkbw/LSee86lP4XsQYMx98= +000002_create_user_group_table.up.sql h1:+fOxjCFeU5GoVTO5cXzxWsMZtz2Qz3tal9vT5kdYuFI= +000003_add_last_version_date_mod_table.up.sql h1:t73i5gC2YrwlIcDn/MZmznGnArF0aA8dLYuA9NnVtbE= +000004_add_more_oauth_options.up.sql h1:UfHJiPBYFTjXHL17LQZ4ZgV/DVrghwDXNW8/RbODtaE= +000005_create_user_group_table.up.sql h1:EJZXV0bZqwqoVa6P6PmaolKRIYicgIsChRGggsiJ6lo= +000006_sml_versions_table.up.sql h1:5XDtXz2jQbdvo60fy5B5Ce8IjIv8ps3Ft24WhUCeJgg= +000007_relationships.up.sql h1:1WYFF1wqu0RkWwkWaNwb2A/oB9w9QPG5arrp0mT4WqE= +000008_version_dependencies.up.sql h1:N1z3vwv9inkKVLNsFif1At1UKAcAESxcfxJvkFOcSDs= +000009_bootstrap_versions_table.up.sql h1:w/1bXOeE/oXZCpWrBAZqHRZpeobofO2u4fYQvLu1oGg= +000010_add_version_dependency_optional.up.sql h1:9cHZYZ6TO05wvf0KCfl7+kZJLtLk3UDzF82AN1Hn7l0= +000011_add_mod_reference.up.sql h1:xGokeJASPuf5VnbehlA+fK8zHpevyeZG+r7u1z3tBrA= +000012_add_version_metadata.up.sql h1:redOIFgiRg6ggVs6tmxXvwxJS1xrCrqMdNFm/Buc5d0= +000013_add_version_mod_reference.up.sql h1:JgnH3EpwY4tulGYAlwVztW+eXG6Fh2/rHyDQm5mxfrk= +000014_add_version_split_hidden.up.sql h1:m8+Ai12K/ktPMD5vnKzTmf826pJfsICbQ1YcIruwO4U= +000015_enable_trgm.up.sql h1:K8lVS0W+1MVfuavMgRHplm8mTJowQojOj6zYux6QqHQ= +000016_add_user_groups_dates.up.sql h1:UyASdzLCBLFXhSFU5DkIznmy/2pIj8NeiL86oac0R7I= +000017_add_version_indexes.up.sql h1:n+BDJKAqvkp+z2faXsIgwNLwqMsSS307rKHCfUou4zQ= +000018_add_announcements.up.sql h1:X6OHBgP8fHQwcfRemioYD+CbipdZW5IzQiXwz2aCaK0= +000019_add_tags.up.sql h1:XStGF4N1GNGY2HTgY8YjpCTB7+V9mj431P5zSGJ3Ewo= +000020_add_compatibility.up.sql h1:Q4v3tPOH5xhFjxHkgxBz6zAsDieltsjM0s0WgrF9C8g= +000021_add_mod_platform.up.sql h1:Gzea7AIiEqsxWT6ti3ZtnzlwaHcx8U93uVY/+A9QJrc= +000022_update_mod_targets.up.sql h1:9VZrns7VPceKdEfhfchdbss3GBP+Ih7/SJjs+sA4UnM= +000023_migrate_versions_to_targets.up.sql h1:NytNFpV/ug5hxc6OM1RWvI+eJ3n1QFsERjWZ3dP3fig= +000024_add_sml_engine_version.up.sql h1:s1fzd/7sjyxtfFuh8bFbGCLTlZLjryMV6GHtJNnuTaY= +000025_add_tag_description.up.sql h1:7UdZZTJ70RJ+tA9M+EiVh+KqwwljYdPw27UQxrMedH8= +000026_add_rng.up.sql h1:y2Q8DUV27wx8/eKvTPduSU0RseM7wfCU79x1tvMmRY0= +000027_add_id_columns.up.sql h1:lILQ8le1eipNJuHuqKMaRK6RW8jBGpWOz8GDhiKEAIo= +000028_increase_token_length_limit.up.sql h1:U70DVHXY6f6vqwKxOQJzhnEZmYE5ML0+7Jc5Vh4tXb4= +000029_sml_as_mod.up.sql h1:e6Foai/N7l/zYvntn9+kNKGGPagGWYDaJ5X6XGse4lY= +000030_db_normalization.up.sql h1:rF0E/b2sF9jz3rzm1/1Ql0/TkMirgaj4w0jXTo65TMo= +20240705180551_initial_transfer_to_atlas.up.sql h1:ajYV7/WSvuMOYJDvHN0MY4z2VnX9ANJBIdV+ihZ9EGo= +20240815141045_drop_version_stability_enum.up.sql h1:ywxbAJ9lnwR6JOC+KRaW4r7nXRrLPx0J3INhD3dQlrw= +20240818235330_index_fixes.up.sql h1:YZvT7uroa6JFF+vRoufyn+rf/a/s45O05HTY/dv2Ai0= +20240819092347_user_indexes.up.sql h1:+QCDfycakdaavcoNA+zj0HwbzwfadE2pB3DpiezQS2g= +20240823233610_add_mod_toggles.up.sql h1:nTUp0VvrYxl9G92vjsP69Prgcwk4L4E4mehBcOH4sv0= +20240826153722_add_thumbhash.up.sql h1:1YhxpFNMlJQm3Xi42zD2XZVsJOPy4vNigFe1BP1E63c= +20240930114249_add_required_on_remote.up.sql h1:G3uEz4oAPvu+Q7kEVvZTiMYHMv6v/c+iImQGbQye+TQ= +20241002191358_state_fix.up.sql h1:PkJ9r2oq+nxMtZgWfjhPUvWhlGVLlEeky/1xqTrURjM= +20241003161005_create_virustotal_results_table.up.sql h1:u6cVcBPQnurXvy5pqbyzG6C4ThJ59v6dmhp5DgZBrBE= +20241008092121_nullable_mod_logo.up.sql h1:ZLscID5T67EWW7NVp95cXNyOadb2G5qTH0itfgoCUO4= +20250621220154_drop_stability.up.sql h1:ewDAMNb3LgUpuURmwwuw3+DoXW6I1kKretjqscyXo4Q= diff --git a/mise.lock b/mise.lock index f71ecba2..5dd90718 100644 --- a/mise.lock +++ b/mise.lock @@ -6,9 +6,12 @@ backend = "aqua:minio/mc" "mc.RELEASE.2025-04-08T15-39-49Z" = "sha256:43d44d801a936e48390c8d2dc02c1c1cc1e973becbe71897f28ca06a9f456489" [tools.atlas] -version = "0.32.0" +version = "0.35.0" backend = "aqua:ariga/atlas" +[tools.atlas.checksums] +"atlas-linux-amd64-v0.35.0" = "sha256:8e8e9b256498c58bdfc96211942402632e12151ec87dd0f9153294f56f2879e6" + [tools.go] version = "1.24.4" backend = "core:go" diff --git a/mise.toml b/mise.toml index 05f29226..d8dcaec1 100644 --- a/mise.toml +++ b/mise.toml @@ -1,6 +1,6 @@ [tools] "aqua:minio/mc" = "RELEASE.2025-04-08T15-39-49Z" -atlas = "0.32.0" +atlas = "0.35.0" go = "1.24.4" go-junit-report = "2.1.0" golangci-lint = "2.1.6" diff --git a/models/filters.go b/models/filters.go index 2c2886d5..80c4d0a9 100644 --- a/models/filters.go +++ b/models/filters.go @@ -54,7 +54,6 @@ func (f *VersionFilter) AddField(name string) { "sml_version", "changelog", "downloads", - "stability", "approved", "updated_at", "created_at", diff --git a/nodes/mod.go b/nodes/mod.go index 8d5a3c93..f2ebf0c1 100644 --- a/nodes/mod.go +++ b/nodes/mod.go @@ -161,32 +161,11 @@ func getModsByIDs(c echo.Context) (interface{}, *ErrorResponse) { // @Param modId path string true "Mod ID" // @Success 200 // @Router /mod/{modId}/latest-versions [get] -func getModLatestVersions(c echo.Context) (interface{}, *ErrorResponse) { - modID := c.Param("modId") - - versions, err := db.From(c.Request().Context()).Version.Query(). - WithTargets(). - Modify(func(s *sql.Selector) { - s.SelectExpr(sql.ExprP("distinct on (mod_id, stability) *")) - }). - Where(version2.Approved(true), version2.Denied(false), version2.ModID(modID)). - Order(version2.ByModID(), version2.ByStability(sql.OrderDesc()), version2.ByCreatedAt(sql.OrderDesc())). - All(c.Request().Context()) - if err != nil { - slox.Error(c.Request().Context(), "failed fetching versions", slog.Any("err", err)) - return nil, &ErrorVersionNotFound - } - - if versions == nil { - return nil, &ErrorVersionNotFound - } - +func getModLatestVersions(_ echo.Context) (interface{}, *ErrorResponse) { + // Note: Stability system has been removed. Returning empty objects for API compatibility. + // TODO: Remove this once clients are updated to not use stability-based queries. result := make(map[string]*generated.Version) - for _, v := range versions { - result[string(v.Stability)] = (*conv.VersionImpl)(nil).Convert(v) - } - return result, nil } @@ -198,38 +177,11 @@ func getModLatestVersions(c echo.Context) (interface{}, *ErrorResponse) { // @Param modIds path string true "Mod IDs" // @Success 200 // @Router /mods/{modIds}/latest-versions [get] -func getModsLatestVersions(c echo.Context) (interface{}, *ErrorResponse) { - modID := c.Param("modIds") - modIDSplit := strings.Split(modID, ",") - - // TODO limit amount of mods requestable - - versions, err := db.From(c.Request().Context()).Version.Query(). - WithTargets(). - Modify(func(s *sql.Selector) { - s.SelectExpr(sql.ExprP("distinct on (mod_id, stability) *")) - }). - Where(version2.Approved(true), version2.Denied(false), version2.ModIDIn(modIDSplit...)). - Order(version2.ByModID(), version2.ByStability(sql.OrderDesc()), version2.ByCreatedAt(sql.OrderDesc())). - All(c.Request().Context()) - if err != nil { - slox.Error(c.Request().Context(), "failed fetching versions", slog.Any("err", err)) - return nil, &ErrorVersionNotFound - } - - if versions == nil { - return nil, &ErrorVersionNotFound - } - +func getModsLatestVersions(_ echo.Context) (interface{}, *ErrorResponse) { + // Note: Stability system has been removed. Returning empty objects for API compatibility. + // TODO: Remove this once clients are updated to not use stability-based queries. result := make(map[string]map[string]*generated.Version) - for _, v := range versions { - if _, ok := result[v.ModID]; !ok { - result[v.ModID] = make(map[string]*generated.Version) - } - result[v.ModID][string(v.Stability)] = (*conv.VersionImpl)(nil).Convert(v) - } - return result, nil } diff --git a/util/db.go b/util/db.go index 8c24e4d2..dfb4d286 100644 --- a/util/db.go +++ b/util/db.go @@ -1,21 +1,5 @@ package util -type Stability string - -const ( - StabilityRelease = "release" - StabilityBeta = "beta" - StabilityAlpha = "alpha" -) - -func (s Stability) Values() []string { - return []string{ - StabilityRelease, - StabilityBeta, - StabilityAlpha, - } -} - type CompatibilityInfo struct { Ea Compatibility `gorm:"type:compatibility" json:"EA"` Exp Compatibility `gorm:"type:compatibility" json:"EXP"` diff --git a/workflows/versionupload/create_version_in_database.go b/workflows/versionupload/create_version_in_database.go index 92bc67d8..b62ec11b 100644 --- a/workflows/versionupload/create_version_in_database.go +++ b/workflows/versionupload/create_version_in_database.go @@ -11,7 +11,6 @@ import ( "github.com/satisfactorymodding/smr-api/generated" "github.com/satisfactorymodding/smr-api/generated/ent" mod2 "github.com/satisfactorymodding/smr-api/generated/ent/mod" - "github.com/satisfactorymodding/smr-api/util" "github.com/satisfactorymodding/smr-api/validation" ) @@ -40,7 +39,6 @@ func (*A) CreateVersionInDatabaseActivity(ctx context.Context, args CreateVersio SetRequiredOnRemote(args.ModInfo.RequiredOnRemote). SetChangelog(args.Version.Changelog). SetModID(args.ModID). - SetStability(util.Stability(args.Version.Stability)). SetModReference(args.ModInfo.ModReference). SetKey(args.FileKey). SetSize(args.ModInfo.Size). From 1bf830e22c31753ed62d5e4f479c8d3423c6571b Mon Sep 17 00:00:00 2001 From: Vilsol Date: Sun, 22 Jun 2025 02:19:55 +0300 Subject: [PATCH 2/2] fix: default to release stability --- conversion/ent_to_graphql.go | 10 ++++++++-- generated/conv/sml_version.go | 1 + generated/conv/version.go | 1 + 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/conversion/ent_to_graphql.go b/conversion/ent_to_graphql.go index 4811aee9..f6112fea 100644 --- a/conversion/ent_to_graphql.go +++ b/conversion/ent_to_graphql.go @@ -26,13 +26,18 @@ type SMLVersion interface { // goverter:map Edges.Targets Targets // goverter:map CreatedAt Date // goverter:map GameVersion SatisfactoryVersion | SMLSatisfactoryVersion - // goverter:ignore EngineVersion BootstrapVersion Link Stability + // goverter:map . Stability | DefaultStability + // goverter:ignore EngineVersion BootstrapVersion Link Convert(source *ent.Version) *generated.SMLVersion ConvertSlice(source []*ent.Version) []*generated.SMLVersion // goverter:ignore Link ConvertTarget(source ent.VersionTarget) generated.SMLVersionTarget } +func DefaultStability(_ *ent.Version) generated.VersionStabilities { + return generated.VersionStabilitiesRelease +} + // goverter:converter // goverter:output:file ../generated/conv/satisfactory_version.go // goverter:output:package conv @@ -99,7 +104,8 @@ type Mod interface { // goverter:extend TimeToString UIntToInt Int64ToInt type Version interface { // goverter:map Edges.Targets Targets - // goverter:ignore Link Mod Dependencies SmlVersion VirustotalResults Stability + // goverter:map . Stability | DefaultStability + // goverter:ignore Link Mod Dependencies SmlVersion VirustotalResults Convert(source *ent.Version) *generated.Version ConvertSlice(source []*ent.Version) []*generated.Version diff --git a/generated/conv/sml_version.go b/generated/conv/sml_version.go index 2c9cd9bb..d2be2909 100755 --- a/generated/conv/sml_version.go +++ b/generated/conv/sml_version.go @@ -18,6 +18,7 @@ func (c *SMLVersionImpl) Convert(source *ent.Version) *generated.SMLVersion { generatedSMLVersion.ID = (*source).ID generatedSMLVersion.Version = (*source).Version generatedSMLVersion.SatisfactoryVersion = conversion.SMLSatisfactoryVersion((*source).GameVersion) + generatedSMLVersion.Stability = conversion.DefaultStability(source) if (*source).Edges.Targets != nil { generatedSMLVersion.Targets = make([]*generated.SMLVersionTarget, len((*source).Edges.Targets)) for i := 0; i < len((*source).Edges.Targets); i++ { diff --git a/generated/conv/version.go b/generated/conv/version.go index 6b773ea9..b664fc1e 100755 --- a/generated/conv/version.go +++ b/generated/conv/version.go @@ -85,6 +85,7 @@ func (c *VersionImpl) Convert(source *ent.Version) *generated.Version { generatedVersion.RequiredOnRemote = (*source).RequiredOnRemote generatedVersion.Changelog = (*source).Changelog generatedVersion.Downloads = conversion.UIntToInt((*source).Downloads) + generatedVersion.Stability = conversion.DefaultStability(source) generatedVersion.Approved = (*source).Approved generatedVersion.UpdatedAt = conversion.TimeToString((*source).UpdatedAt) generatedVersion.CreatedAt = conversion.TimeToString((*source).CreatedAt)