┌─ GO ───────────────────────────────────────────────────────────────────────┐
│ package indexes │
│ │
│ import ( │
│ "database/sql" │
│ "fmt" │
│ "path/filepath" │
│ │
│ "ookstats/internal/writer" │
│ ) │
│ │
│ // GenerateClassScopeIndex generates scope index for a specific class │
│ func GenerateClassScopeIndex(outDir string, seasonID int, classKey string) error { │
│ scopes := []ClassScopeData{ │
│ { │
│ Scope: "global", │
│ Href: fmt.Sprintf("/api/leaderboard/season/%d/players/class/%s/global/{page}.j │
│ son", seasonID, classKey), │
│ }, │
│ { │
│ Scope: "regional", │
│ Href: fmt.Sprintf("/api/leaderboard/season/%d/players/class/%s/regional/index. │
│ json", seasonID, classKey), │
│ }, │
│ { │
│ Scope: "realm", │
│ Href: fmt.Sprintf("/api/leaderboard/season/%d/players/class/%s/realm/index.jso │
│ n", seasonID, classKey), │
│ }, │
│ } │
│ │
│ index := ClassScopeIndex{ │
│ Data: scopes, │
│ Metadata: NewIndexMetadata(len(scopes)), │
│ } │
│ │
│ outPath := filepath.Join(outDir, "api", "leaderboard", "season", fmt.Sprintf("%d" │
│ , seasonID), "players", "class", classKey, "index.json") │
│ if err := writer.WriteJSONFile(outPath, index); err != nil { │
│ return err │
│ } │
│ │
│ return nil │
│ } │
│ │
│ // GenerateClassRegionalIndex generates regional index for a class │
│ func GenerateClassRegionalIndex(outDir string, seasonID int, classKey string) erro │
│ r { │
│ regions := []RegionData{ │
│ {Region: "us", Href: fmt.Sprintf("/api/leaderboard/season/%d/players/class/%s/re │
│ gional/us/{page}.json", seasonID, classKey)}, │
│ {Region: "eu", Href: fmt.Sprintf("/api/leaderboard/season/%d/players/class/%s/re │
│ gional/eu/{page}.json", seasonID, classKey)}, │
│ {Region: "kr", Href: fmt.Sprintf("/api/leaderboard/season/%d/players/class/%s/re │
│ gional/kr/{page}.json", seasonID, classKey)}, │
│ {Region: "tw", Href: fmt.Sprintf("/api/leaderboard/season/%d/players/class/%s/re │
│ gional/tw/{page}.json", seasonID, classKey)}, │
│ } │
│ │
│ index := RegionsIndex{ │
│ Data: regions, │
│ Metadata: NewIndexMetadata(len(regions)), │
│ } │
│ │
│ outPath := filepath.Join(outDir, "api", "leaderboard", "season", fmt.Sprintf("%d" │
│ , seasonID), "players", "class", classKey, "regional", "index.json") │
│ if err := writer.WriteJSONFile(outPath, index); err != nil { │
│ return err │
│ } │
│ │
│ return nil │
│ } │
│ │
│ // GenerateClassRealmRegionIndex generates realm region index for a class │
│ func GenerateClassRealmRegionIndex(outDir string, seasonID int, classKey string) e │
│ rror { │
│ regions := []RegionData{ │
│ {Region: "us", Href: fmt.Sprintf("/api/leaderboard/season/%d/players/class/%s/re │
│ alm/us/index.json", seasonID, classKey)}, │
│ {Region: "eu", Href: fmt.Sprintf("/api/leaderboard/season/%d/players/class/%s/re │
│ alm/eu/index.json", seasonID, classKey)}, │
│ {Region: "kr", Href: fmt.Sprintf("/api/leaderboard/season/%d/players/class/%s/re │
│ alm/kr/index.json", seasonID, classKey)}, │
│ {Region: "tw", Href: fmt.Sprintf("/api/leaderboard/season/%d/players/class/%s/re │
│ alm/tw/index.json", seasonID, classKey)}, │
│ } │
│ │
│ index := RegionsIndex{ │
│ Data: regions, │
│ Metadata: NewIndexMetadata(len(regions)), │
│ } │
│ │
│ outPath := filepath.Join(outDir, "api", "leaderboard", "season", fmt.Sprintf("%d" │
│ , seasonID), "players", "class", classKey, "realm", "index.json") │
│ if err := writer.WriteJSONFile(outPath, index); err != nil { │
│ return err │
│ } │
│ │
│ return nil │
│ } │
│ │
│ // GenerateClassRealmListIndex generates realm list for a class and region │
│ func GenerateClassRealmListIndex(db *sql.DB, outDir string, seasonID int, classKey │
│ , region string) error { │
│ rows, err := db.Query(`SELECT slug FROM realms WHERE region = ? ORDER BY slug`, r │
│ egion) │
│ if err != nil { │
│ return fmt.Errorf("query realms: %w", err) │
│ } │
│ defer rows.Close() │
│ │
│ var realms []RegionData │
│ for rows.Next() { │
│ var slug string │
│ if err := rows.Scan(&slug); err != nil { │
│ return err │
│ } │
│ realms = append(realms, RegionData{ │
│ Region: slug, │
│ Href: fmt.Sprintf("/api/leaderboard/season/%d/players/class/%s/realm/%s/%s/{p │
│ age}.json", seasonID, classKey, region, slug), │
│ }) │
│ } │
│ │
│ index := RegionsIndex{ │
│ Data: realms, │
│ Metadata: NewIndexMetadata(len(realms)), │
│ } │
│ │
│ outPath := filepath.Join(outDir, "api", "leaderboard", "season", fmt.Sprintf("%d" │
│ , seasonID), "players", "class", classKey, "realm", region, "index.json") │
│ if err := writer.WriteJSONFile(outPath, index); err != nil { │
│ return err │
│ } │
│ │
│ return nil │
│ } │
└────────────────────────────────────────────────────────────────────────────────────┘
┌─ GO ─────────────────────────────────┐
│ package indexes │
│ │
│ import ( │
│ "database/sql" │
│ "fmt" │
│ "path/filepath" │
│ │
│ "ookstats/internal/writer" │
│ ) │
│ │
│ // GenerateClassScopeIndex generates scope i │
│ ndex for a specific class │
│ func GenerateClassScopeIndex(outDir string, │
│ seasonID int, classKey string) error { │
│ scopes := []ClassScopeData{ │
│ { │
│ Scope: "global", │
│ Href: fmt.Sprintf("/api/leaderboard/seas │
│ on/%d/players/class/%s/global/{page}.json", │
│ seasonID, classKey), │
│ }, │
│ { │
│ Scope: "regional", │
│ Href: fmt.Sprintf("/api/leaderboard/seas │
│ on/%d/players/class/%s/regional/index.json", │
│ seasonID, classKey), │
│ }, │
│ { │
│ Scope: "realm", │
│ Href: fmt.Sprintf("/api/leaderboard/seas │
│ on/%d/players/class/%s/realm/index.json", se │
│ asonID, classKey), │
│ }, │
│ } │
│ │
│ index := ClassScopeIndex{ │
│ Data: scopes, │
│ Metadata: NewIndexMetadata(len(scopes)), │
│ } │
│ │
│ outPath := filepath.Join(outDir, "api", "le │
│ aderboard", "season", fmt.Sprintf("%d", seas │
│ onID), "players", "class", classKey, "index. │
│ json") │
│ if err := writer.WriteJSONFile(outPath, ind │
│ ex); err != nil { │
│ return err │
│ } │
│ │
│ return nil │
│ } │
│ │
│ // GenerateClassRegionalIndex generates regi │
│ onal index for a class │
│ func GenerateClassRegionalIndex(outDir strin │
│ g, seasonID int, classKey string) error { │
│ regions := []RegionData{ │
│ {Region: "us", Href: fmt.Sprintf("/api/lea │
│ derboard/season/%d/players/class/%s/regional │
│ /us/{page}.json", seasonID, classKey)}, │
│ {Region: "eu", Href: fmt.Sprintf("/api/lea │
│ derboard/season/%d/players/class/%s/regional │
│ /eu/{page}.json", seasonID, classKey)}, │
│ {Region: "kr", Href: fmt.Sprintf("/api/lea │
│ derboard/season/%d/players/class/%s/regional │
│ /kr/{page}.json", seasonID, classKey)}, │
│ {Region: "tw", Href: fmt.Sprintf("/api/lea │
│ derboard/season/%d/players/class/%s/regional │
│ /tw/{page}.json", seasonID, classKey)}, │
│ } │
│ │
│ index := RegionsIndex{ │
│ Data: regions, │
│ Metadata: NewIndexMetadata(len(regions)), │
│ } │
│ │
│ outPath := filepath.Join(outDir, "api", "le │
│ aderboard", "season", fmt.Sprintf("%d", seas │
│ onID), "players", "class", classKey, "region │
│ al", "index.json") │
│ if err := writer.WriteJSONFile(outPath, ind │
│ ex); err != nil { │
│ return err │
│ } │
│ │
│ return nil │
│ } │
│ │
│ // GenerateClassRealmRegionIndex generates r │
│ ealm region index for a class │
│ func GenerateClassRealmRegionIndex(outDir st │
│ ring, seasonID int, classKey string) error { │
│ regions := []RegionData{ │
│ {Region: "us", Href: fmt.Sprintf("/api/lea │
│ derboard/season/%d/players/class/%s/realm/us │
│ /index.json", seasonID, classKey)}, │
│ {Region: "eu", Href: fmt.Sprintf("/api/lea │
│ derboard/season/%d/players/class/%s/realm/eu │
│ /index.json", seasonID, classKey)}, │
│ {Region: "kr", Href: fmt.Sprintf("/api/lea │
│ derboard/season/%d/players/class/%s/realm/kr │
│ /index.json", seasonID, classKey)}, │
│ {Region: "tw", Href: fmt.Sprintf("/api/lea │
│ derboard/season/%d/players/class/%s/realm/tw │
│ /index.json", seasonID, classKey)}, │
│ } │
│ │
│ index := RegionsIndex{ │
│ Data: regions, │
│ Metadata: NewIndexMetadata(len(regions)), │
│ } │
│ │
│ outPath := filepath.Join(outDir, "api", "le │
│ aderboard", "season", fmt.Sprintf("%d", seas │
│ onID), "players", "class", classKey, "realm" │
│ , "index.json") │
│ if err := writer.WriteJSONFile(outPath, ind │
│ ex); err != nil { │
│ return err │
│ } │
│ │
│ return nil │
│ } │
│ │
│ // GenerateClassRealmListIndex generates rea │
│ lm list for a class and region │
│ func GenerateClassRealmListIndex(db *sql.DB, │
│ outDir string, seasonID int, classKey, regi │
│ on string) error { │
│ rows, err := db.Query(`SELECT slug FROM rea │
│ lms WHERE region = ? ORDER BY slug`, region) │
│ if err != nil { │
│ return fmt.Errorf("query realms: %w", err) │
│ } │
│ defer rows.Close() │
│ │
│ var realms []RegionData │
│ for rows.Next() { │
│ var slug string │
│ if err := rows.Scan(&slug); err != nil { │
│ return err │
│ } │
│ realms = append(realms, RegionData{ │
│ Region: slug, │
│ Href: fmt.Sprintf("/api/leaderboard/sea │
│ son/%d/players/class/%s/realm/%s/%s/{page}.j │
│ son", seasonID, classKey, region, slug), │
│ }) │
│ } │
│ │
│ index := RegionsIndex{ │
│ Data: realms, │
│ Metadata: NewIndexMetadata(len(realms)), │
│ } │
│ │
│ outPath := filepath.Join(outDir, "api", "le │
│ aderboard", "season", fmt.Sprintf("%d", seas │
│ onID), "players", "class", classKey, "realm" │
│ , region, "index.json") │
│ if err := writer.WriteJSONFile(outPath, ind │
│ ex); err != nil { │
│ return err │
│ } │
│ │
│ return nil │
│ } │
└──────────────────────────────────────────────┘