-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathmain.go
More file actions
616 lines (552 loc) · 41.7 KB
/
Copy pathmain.go
File metadata and controls
616 lines (552 loc) · 41.7 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
package main
import (
"context"
"fmt"
"log"
"net/http"
"os"
"os/signal"
"syscall"
"time"
"github.com/CalebRose/SimFBA/controller"
"github.com/CalebRose/SimFBA/dbprovider"
"github.com/CalebRose/SimFBA/middleware"
"github.com/CalebRose/SimFBA/structs"
"github.com/CalebRose/SimFBA/ws"
"github.com/gorilla/handlers"
"github.com/gorilla/mux"
_ "github.com/jinzhu/gorm/dialects/mysql"
"github.com/joho/godotenv"
"github.com/nelkinda/health-go"
"github.com/nelkinda/health-go/checks/sendgrid"
"github.com/robfig/cron/v3"
//cache "github.com/victorspringer/http-cache"
//"github.com/victorspringer/http-cache/adapter/memory"
)
func InitialMigration() {
initiate := dbprovider.GetInstance().InitDatabase()
if !initiate {
log.Println("Initiate pool failure... Ending application")
os.Exit(1)
}
}
func monitorDBForUpdates() {
var ts structs.Timestamp
for {
currentTS := controller.GetUpdatedTimestamp()
if currentTS.UpdatedAt.After(ts.UpdatedAt) {
ts = currentTS
err := ws.BroadcastTSUpdate(ts)
if err != nil {
log.Printf("Error broadcasting timestamp: %v", err)
}
}
time.Sleep(60 * time.Second)
}
}
func handleRequests() http.Handler {
myRouter := mux.NewRouter().StrictSlash(true)
// Handler & Middleware
loadEnvs()
origins := os.Getenv("ORIGIN_ALLOWED")
originsOk := handlers.AllowedOrigins([]string{origins})
headersOk := handlers.AllowedHeaders([]string{"Content-Type", "Authorization", "Accept", "X-Requested-With", "Access-Control-Request-Method", "Access-Control-Request-Headers", "Access-Control-Allow-Origin"})
methodsOk := handlers.AllowedMethods([]string{"GET", "POST", "OPTIONS", "PUT", "HEAD", "DELETE"})
apiRouter := myRouter.PathPrefix("/api").Subrouter()
apiRouter.Use(middleware.GzipMiddleware)
/*memcached, err := memory.NewAdapter(
memory.AdapterWithAlgorithm(memory.LRU),
memory.AdapterWithStorageCapacity(1000000000), // 1GB max capacity
)
if err != nil {
log.Fatal(err)
}
cacheClient, err := cache.NewClient(
cache.ClientWithAdapter(memcached),
cache.ClientWithTTL(10*time.Minute),
cache.ClientWithRefreshKey("opn"),
)
if err != nil {
log.Fatal(err)
}
cachedApiRouter := myRouter.PathPrefix("/api").Subrouter()
cachedApiRouter.Use(middleware.GzipMiddleware)
cachedApiRouter.Use(cacheClient.Middleware)*/
// Health Controls
HealthCheck := health.New(
health.Health{
Version: "1",
ReleaseID: "0.0.7-SNAPSHOT",
},
sendgrid.Health(),
)
myRouter.HandleFunc("/health", HealthCheck.Handler).Methods("GET")
// Admin Controls
apiRouter.HandleFunc("/admin/generate/ts/models/", controller.CreateTSModelsFile).Methods("GET")
// apiRouter.HandleFunc("/admin/fire/it/up/", controller.FireItUp).Methods("GET")
apiRouter.HandleFunc("/simfba/get/timestamp/", controller.GetCurrentTimestamp).Methods("GET")
apiRouter.HandleFunc("/simfba/sync/timestamp/", controller.SyncTimestamp).Methods("POST")
apiRouter.HandleFunc("/simfba/sync/week/", controller.SyncWeek).Methods("GET")
apiRouter.HandleFunc("/simfba/sync/timeslot/{timeslot}", controller.SyncTimeslot).Methods("GET")
// apiRouter.HandleFunc("/simfba/regress/timeslot/{timeslot}", controller.RegressTimeslot).Methods("GET")
apiRouter.HandleFunc("/simfba/sync/freeagency/round", controller.SyncFreeAgencyRound).Methods("GET")
apiRouter.HandleFunc("/simfba/sync/recruiting/", controller.SyncRecruiting).Methods("GET")
// apiRouter.HandleFunc("/simfba/sync/season/", controller.SyncToNextSeason).Methods("GET")
// apiRouter.HandleFunc("/simfba/sync/missing/", controller.SyncMissingRES).Methods("GET")
apiRouter.HandleFunc("/simfba/mass/{off}/{def}", controller.MassUpdateGameplans).Methods("GET")
apiRouter.HandleFunc("/simfba/sync/weather/", controller.WeatherGenerator).Methods("GET")
apiRouter.HandleFunc("/simfba/current/weather/forecast/", controller.GetWeatherForecast).Methods("GET")
apiRouter.HandleFunc("/simfba/future/weather/forecast/", controller.GetFutureWeatherForecast).Methods("GET")
apiRouter.HandleFunc("/news/{weekID}/{seasonID}/", controller.GetNewsLogs).Methods("GET")
apiRouter.HandleFunc("/season/{seasonID}/weeks/{weekID}", controller.GetWeeksInSeason).Methods("GET")
apiRouter.HandleFunc("/admin/teams/croot/sync", controller.SyncTeamRecruitingRanks).Methods("GET")
apiRouter.HandleFunc("/admin/recruiting/class/size", controller.GetRecruitingClassSizeForTeams).Methods("GET")
apiRouter.HandleFunc("/admin/ai/fill/boards", controller.FillAIBoards).Methods("GET")
apiRouter.HandleFunc("/admin/ai/sync/boards", controller.SyncAIBoards).Methods("GET")
// This endpoint should be used right before the redshirt deadline.
apiRouter.HandleFunc("/admin/ai/apply/redshirts/{seasonID}", controller.AllocateAIRedshirts).Methods("GET")
apiRouter.HandleFunc("/admin/run/the/games/", controller.RunTheGames).Methods("GET")
// apiRouter.HandleFunc("/admin/overall/progressions/next/season", controller.ProgressToNextSeason).Methods("GET")
// apiRouter.HandleFunc("/admin/overall/progressions/nfl", controller.ProgressNFL).Methods("GET")
apiRouter.HandleFunc("/admin/trades/accept/sync/{proposalID}", controller.SyncAcceptedTrade).Methods("GET")
apiRouter.HandleFunc("/admin/trades/veto/sync/{proposalID}", controller.VetoAcceptedTrade).Methods("GET")
apiRouter.HandleFunc("/admin/trades/cleanup", controller.CleanUpRejectedTrades).Methods("GET")
apiRouter.HandleFunc("/admin/process-udfas", controller.ProcessUDFAs).Methods("GET")
// Bootstrap
apiRouter.HandleFunc("/bootstrap/teams", controller.BootstrapTeamData).Methods("GET")
apiRouter.HandleFunc("/bootstrap/landing/{collegeID}/{proID}", controller.BootstrapLandingData).Methods("GET")
apiRouter.HandleFunc("/bootstrap/roster/{collegeID}/{proID}", controller.BootstrapTeamRosterData).Methods("GET")
apiRouter.HandleFunc("/bootstrap/recruiting/{collegeID}", controller.BootstrapRecruitingData).Methods("GET")
apiRouter.HandleFunc("/bootstrap/freeagency/{proID}", controller.BootstrapFreeAgencyData).Methods("GET")
apiRouter.HandleFunc("/bootstrap/scheduling/{username}/{collegeID}/{seasonID}", controller.BootstrapSchedulingData).Methods("GET")
apiRouter.HandleFunc("/bootstrap/draft/{proID}", controller.BootstrapDraftData).Methods("GET")
apiRouter.HandleFunc("/bootstrap/portal/{collegeID}", controller.BootstrapPortalData).Methods("GET")
apiRouter.HandleFunc("/bootstrap/gameplan/{collegeID}/{proID}", controller.BootstrapGameplanData).Methods("GET")
apiRouter.HandleFunc("/bootstrap/news/{collegeID}/{proID}", controller.BootstrapNewsData).Methods("GET")
apiRouter.HandleFunc("/bootstrap/stats/{collegeID}/{proID}", controller.BootstrapStatsData).Methods("GET")
apiRouter.HandleFunc("/bootstrap/players/{collegeID}/{proID}", controller.BootstrapPlayerData).Methods("GET")
// Capsheet Controls
apiRouter.HandleFunc("/nfl/capsheet/generate", controller.GenerateCapsheets).Methods("GET")
apiRouter.HandleFunc("/nfl/contracts/get/value", controller.CalculateContracts).Methods("GET")
// Draft Controls
apiRouter.HandleFunc("/nfl/draft/draftees/export", controller.ExportDrafteesToCSV).Methods("GET")
apiRouter.HandleFunc("/nfl/draft/export/picks", controller.ExportDraftedPicks).Methods("POST")
apiRouter.HandleFunc("/nfl/draft/page/{teamID}", controller.GetDraftPageData).Methods("GET")
apiRouter.HandleFunc("/nfl/draft/time/change", controller.ToggleDraftTime).Methods("GET")
apiRouter.HandleFunc("/nfl/draft/create/scoutprofile", controller.AddPlayerToScoutBoard).Methods("POST")
apiRouter.HandleFunc("/nfl/draft/reveal/attribute", controller.RevealScoutingAttribute).Methods("POST")
apiRouter.HandleFunc("/nfl/draft/remove/{id}", controller.RemovePlayerFromScoutBoard).Methods("GET")
apiRouter.HandleFunc("/nfl/draft/scout/{id}", controller.GetScoutingDataByDraftee).Methods("GET")
// apiRouter.HandleFunc("/nfl/draft/boom/bust", controller.BoomOrBust).Methods("GET")
// Face Controls
// apiRouter.HandleFunc("/faces/migrate", controller.MigrateFaceData).Methods("GET")
// apiRouter.HandleFunc("/spending/count/fix", controller.FixSpendingCount).Methods("GET")
apiRouter.HandleFunc("/faces", controller.GetAllFaces).Methods("GET")
// Fix Controls -- endpoitns that fixed issues
// apiRouter.HandleFunc("/nfl/draft/fix/draftee/potentials", controller.FixNFLDrafteePotentialGrades).Methods("GET")
// apiRouter.HandleFunc("/games/byeweek/fix/", controller.FixByeWeekLogic).Methods("GET")
// apiRouter.HandleFunc("/import/simfba/fix/contracts", controller.FixBrokenExtensions).Methods("GET")
// apiRouter.HandleFunc("/fix/simcfb/nfl/dts", controller.FixCollegeDTOVRs).Methods("GET")
// apiRouter.HandleFunc("/fix/simcfb/ath/", controller.FixATHProgressions).Methods("GET")
// apiRouter.HandleFunc("/fix/simcfb/standings/", controller.FixCollegeStandings).Methods("GET")
// apiRouter.HandleFunc("/fix/simfba/secondary/positions/", controller.FixSecondaryPositions).Methods("GET")
// apiRouter.HandleFunc("/fix/spending/count", controller.FixSpendingCount).Methods("GET")
// apiRouter.HandleFunc("/fix/scheme/penalties", controller.CheckForSchemePenalties).Methods("GET")
// apiRouter.HandleFunc("/fix/recruit/points", controller.FixRecruitPoints).Methods("GET")
// apiRouter.HandleFunc("/fix/formation/names", controller.FixOffensiveFormationNames).Methods("GET")
// apiRouter.HandleFunc("/fix/player/preferences", controller.FixPlayerPreferences).Methods("GET")
// apiRouter.HandleFunc("/admin/fix/affinities", controller.RecalibrateCrootProfiles).Methods("GET")
// apiRouter.HandleFunc("/admin/fix/recruit/points", controller.RecalibrateRecruitPoints).Methods("GET")
// apiRouter.HandleFunc("/fix/profile/mods", controller.FixRecruitProfileMods).Methods("GET")
// apiRouter.HandleFunc("/fix/nfl/stadiums", controller.FixNFLStadiums).Methods("GET")
// apiRouter.HandleFunc("/fix/player/weights", controller.FixPlayerWeights).Methods("GET")
// apiRouter.HandleFunc("/fix/timeslots", controller.FixTimeslots).Methods("GET")
apiRouter.HandleFunc("/fix/broken/gameplans", controller.FixBrokenGameplans).Methods("GET")
// Free Agency Controls
// apiRouter.HandleFunc("/nfl/extensions/sync", controller.SyncExtensions).Methods("GET")
apiRouter.HandleFunc("/nfl/extension/create/offer", controller.CreateExtensionOffer).Methods("POST")
apiRouter.HandleFunc("/nfl/extension/cancel/offer", controller.CancelExtensionOffer).Methods("POST")
apiRouter.HandleFunc("/nfl/freeagency/create/offer", controller.CreateFreeAgencyOffer).Methods("POST")
apiRouter.HandleFunc("/nfl/freeagency/cancel/offer", controller.CancelFreeAgencyOffer).Methods("POST")
apiRouter.HandleFunc("/nfl/waiverwire/create/offer", controller.CreateWaiverWireOffer).Methods("POST")
apiRouter.HandleFunc("/nfl/waiverwire/cancel/offer", controller.CancelWaiverWireOffer).Methods("POST")
apiRouter.HandleFunc("/nfl/freeagency/waiver/order/set", controller.SetWaiverOrderForNFLTeams).Methods("GET")
apiRouter.HandleFunc("/nfl/freeagency/waiver/order/set", controller.SetWaiverOrderForNFLTeams).Methods("GET")
apiRouter.HandleFunc("/nfl/export/freeagents", controller.ExportNFLFreeAgentsToCSV).Methods("GET")
// Game Controls
apiRouter.HandleFunc("/games/update/time/", controller.UpdateTimeslot).Methods("POST", "OPTIONS")
apiRouter.HandleFunc("/games/college/week/{weekID}/", controller.GetCollegeGamesByTimeslotWeekId).Methods("GET")
apiRouter.HandleFunc("/games/college/timeslot/{timeSlot}/{weekID}", controller.GetCollegeGamesByTimeslotWeekId).Methods("GET")
apiRouter.HandleFunc("/games/college/team/{teamID}/{seasonID}", controller.GetCollegeGamesByTeamIDAndSeasonID).Methods("GET")
apiRouter.HandleFunc("/games/college/season/{seasonID}", controller.GetCollegeGamesBySeasonID).Methods("GET")
apiRouter.HandleFunc("/games/nfl/team/{teamID}/{seasonID}", controller.GetNFLGamesByTeamIDAndSeasonID).Methods("GET")
apiRouter.HandleFunc("/games/nfl/season/{seasonID}", controller.GetNFLGamesBySeasonID).Methods("GET")
apiRouter.HandleFunc("/games/result/cfb/{gameID}", controller.GetCollegeGameResultsByGameID).Methods("GET")
apiRouter.HandleFunc("/games/result/nfl/{gameID}", controller.GetNFLGameResultsByGameID).Methods("GET")
apiRouter.HandleFunc("/games/export/results/{seasonID}/{weekID}/{nflWeekID}/{timeslot}", controller.ExportCFBGameResults).Methods("GET")
// Game Request Controls - CFB
apiRouter.HandleFunc("/cfb/schedule/game/request/create", controller.CreateCFBGameRequest).Methods("POST")
apiRouter.HandleFunc("/cfb/schedule/game/request/accept/{requestID}", controller.AcceptCFBGameRequest).Methods("GET")
apiRouter.HandleFunc("/cfb/schedule/game/request/reject/{requestID}", controller.RejectCFBGameRequest).Methods("GET")
apiRouter.HandleFunc("/cfb/schedule/game/request/process/{requestID}", controller.ProcessCFBGameRequest).Methods("GET")
apiRouter.HandleFunc("/cfb/schedule/game/request/veto/{requestID}", controller.VetoCFBGameRequest).Methods("GET")
apiRouter.HandleFunc("/cfb/schedule/game/request/swap/{gameID}", controller.SwapCFBHomeAndAwayTeams).Methods("GET")
// apiRouter.HandleFunc("/cfb/schedule/ooc/game/generation", controller.GenerateOOCGames).Methods("GET")
// Game Request Controls - NFL
apiRouter.HandleFunc("/nfl/schedule/game/request/create", controller.CreateNFLGameRequest).Methods("POST")
apiRouter.HandleFunc("/nfl/schedule/game/request/accept/{requestID}", controller.AcceptNFLGameRequest).Methods("GET")
apiRouter.HandleFunc("/nfl/schedule/game/request/reject/{requestID}", controller.RejectNFLGameRequest).Methods("GET")
apiRouter.HandleFunc("/nfl/schedule/game/request/process/{requestID}", controller.ProcessNFLGameRequest).Methods("GET")
apiRouter.HandleFunc("/nfl/schedule/game/request/veto/{requestID}", controller.VetoNFLGameRequest).Methods("GET")
// Gameplan Controls
apiRouter.HandleFunc("/gameplan/college/team/{teamID}/", controller.GetTeamGameplanByTeamID).Methods("GET")
apiRouter.HandleFunc("/gameplan/college/ai/update/", controller.DetermineAIGameplan).Methods("GET")
apiRouter.HandleFunc("/gameplan/college/updategameplan", controller.UpdateGameplan).Methods("POST")
apiRouter.HandleFunc("/gameplan/college/depthchart/{teamID}/", controller.GetTeamDepthchartByTeamID).Methods("GET")
apiRouter.HandleFunc("/gameplan/college/depthchart/user/check/", controller.CheckAllUserDepthChartsForInjuredPlayers).Methods("GET")
apiRouter.HandleFunc("/gameplan/college/depthchart/ai/update/", controller.UpdateCollegeAIDepthCharts).Methods("GET")
apiRouter.HandleFunc("/gameplan/college/depthchart/positions/{depthChartID}/", controller.GetDepthChartPositionsByDepthChartID).Methods("GET")
apiRouter.HandleFunc("/gameplan/college/updatedepthchart", controller.UpdateDepthChart).Methods("PUT")
apiRouter.HandleFunc("/gameplan/nfl/team/{teamID}/", controller.GetNFLGameplanByTeamID).Methods("GET")
apiRouter.HandleFunc("/gameplan/nfl/updategameplan", controller.UpdateNFLGameplan).Methods("POST")
apiRouter.HandleFunc("/gameplan/nfl/depthchart/{teamID}/", controller.GetNFLDepthChart).Methods("GET")
apiRouter.HandleFunc("/gameplan/nfl/updatedepthchart", controller.UpdateNFLDepthChart).Methods("POST")
apiRouter.HandleFunc("/gameplan/nfl/depthchart/ai/update/", controller.UpdateNFLAIDepthCharts).Methods("GET")
// Generation Controls
// apiRouter.HandleFunc("/admin/generate/walkons", controller.GenerateWalkOns).Methods("GET")
// History Controls
apiRouter.HandleFunc("/history/college", controller.GetCollegeHistoryProfile).Methods("GET")
// Import Controls
// apiRouter.HandleFunc("/admin/import/fcs/gameplans", controller.GenerateNewGameplans).Methods("GET")
// apiRouter.HandleFunc("/admin/import/recruit/ai", controller.ImportRecruitAICSV).Methods("GET")
// apiRouter.HandleFunc("/admin/import/nfl/draft", controller.Import2023DraftedPlayers).Methods("GET")
// apiRouter.HandleFunc("/admin/import/cfb/standings", controller.ImportCFBStandings).Methods("GET")
// apiRouter.HandleFunc("/admin/import/cfb/coaches", controller.GenerateCoachesForAITeams).Methods("GET")
// apiRouter.HandleFunc("/admin/import/cfb/regular/games", controller.ImportCFBRegularSeasonGames).Methods("GET")
// apiRouter.HandleFunc("/admin/import/cfb/spring/games", controller.ImportCFBSpringGames).Methods("GET")
// apiRouter.HandleFunc("/admin/import/cfb/rivals", controller.ImportCFBRivals).Methods("GET")
// apiRouter.HandleFunc("/admin/import/cfb/teams", controller.ImportCFBTeams).Methods("GET")
// apiRouter.HandleFunc("/admin/import/nfl/games", controller.ImportNFLGames).Methods("GET")
// apiRouter.HandleFunc("/admin/import/nfl/warroom", controller.GenerateDraftWarRooms).Methods("GET")
// apiRouter.HandleFunc("/admin/import/nfl/udfas", controller.ImportUDFAs).Methods("GET")
// apiRouter.HandleFunc("/admin/import/missing/recruits", controller.GetMissingRecruitingClasses).Methods("GET")
// apiRouter.HandleFunc("/admin/import/missing/draftees", controller.ImportMissingDraftees).Methods("GET")
// apiRouter.HandleFunc("/admin/import/missing/cfb/stats", controller.ImportMissingStats).Methods("GET")
// apiRouter.HandleFunc("/admin/import/preferences", controller.ImportTradePreferences).Methods("GET")
// apiRouter.HandleFunc("/import/custom/croots", controller.ImportCustomCroots).Methods("GET")
// apiRouter.HandleFunc("/import/simnfl/updated/values", controller.ImportSimNFLMinimumValues).Methods("GET")
// apiRouter.HandleFunc("/import/simfba/draft/picks", controller.ImportNFLDraftPicks).Methods("GET")
// apiRouter.HandleFunc("/import/simfba/updated/picks", controller.UpdateDraftPicksForDraft).Methods("GET")
// apiRouter.HandleFunc("/import/simfba/import/attributes", controller.ImplementPrimeAge).Methods("GET")
// apiRouter.HandleFunc("/import/simcfb/college/standings", controller.CreateCollegeStandings).Methods("GET")
// apiRouter.HandleFunc("/import/simcfb/2021/stats", controller.Import2021CFBStats).Methods("GET")
// apiRouter.HandleFunc("/import/additional/dc/positions", controller.ImportAdditionalDCPositions).Methods("GET")
// apiRouter.HandleFunc("/assign/team/grades", controller.ImportTeamGrades).Methods("GET")
// apiRouter.HandleFunc("/run/predraft/events", controller.RunPreDraftEvents).Methods("GET")
// News Controls
apiRouter.HandleFunc("/cfb/news/all/", controller.GetAllNewsLogsForASeason).Methods("GET")
apiRouter.HandleFunc("/nfl/news/all/", controller.GetAllNFLNewsBySeason).Methods("GET")
apiRouter.HandleFunc("/news/feed/{league}/{teamID}/", controller.GetNewsFeed).Methods("GET")
// Notification Controls
apiRouter.HandleFunc("/fba/inbox/get/{cfbID}/{nflID}/", controller.GetFBAInbox).Methods("GET")
apiRouter.HandleFunc("/notification/toggle/{notiID}", controller.ToggleNotificationAsRead).Methods("GET")
apiRouter.HandleFunc("/notification/delete/{notiID}", controller.DeleteNotification).Methods("GET")
// Offseason
apiRouter.HandleFunc("/offseason/fix/postseason/status", controller.FixPostseasonStatus).Methods("GET")
apiRouter.HandleFunc("/offseason/update/team/profile/affinities", controller.UpdateTeamProfileAffinities).Methods("GET")
apiRouter.HandleFunc("/offseason/nfl/calculate/extension/values", controller.CalculateExtensionValues).Methods("GET")
apiRouter.HandleFunc("/offseason/nfl/calculate/tag/values", controller.CalculateTagValues).Methods("GET")
apiRouter.HandleFunc("/offseason/nfl/reset/minimum/values", controller.ResetNFLMinimumValues).Methods("GET")
apiRouter.HandleFunc("/offseason/nfl/seed/tag/data", controller.SeedTagDataFromJSON).Methods("GET")
// Player Controls
apiRouter.HandleFunc("/players/all/", controller.AllPlayers).Methods("GET")
apiRouter.HandleFunc("/collegeplayers/cut/player/{PlayerID}/", controller.CutCFBPlayerFromRoster).Methods("GET")
apiRouter.HandleFunc("/collegeplayers/heisman/", controller.GetHeismanList).Methods("GET")
apiRouter.HandleFunc("/collegeplayers/team/{teamID}/", controller.AllCollegePlayersByTeamID).Methods("GET")
apiRouter.HandleFunc("/collegeplayers/team/nors/{teamID}/", controller.AllCollegePlayersByTeamIDWithoutRedshirts).Methods("GET")
apiRouter.HandleFunc("/collegeplayers/team/export/{teamID}/", controller.ExportRosterToCSV).Methods("GET")
apiRouter.HandleFunc("/collegeplayers/assign/redshirt/{PlayerID}", controller.ToggleRedshirtStatusForPlayer).Methods("GET", "OPTIONS")
apiRouter.HandleFunc("/nflplayers/team/{teamID}/", controller.AllNFLPlayersByTeamIDForDC).Methods("GET")
apiRouter.HandleFunc("/nflplayers/freeagency/available/{teamID}", controller.FreeAgencyAvailablePlayers).Methods("GET")
apiRouter.HandleFunc("/nflplayers/team/export/{teamID}/", controller.ExportNFLRosterToCSV).Methods("GET")
apiRouter.HandleFunc("/nflplayers/teams/export/all/", controller.ExportAllNFLRostersToCSV).Methods("GET")
apiRouter.HandleFunc("/nflplayers/tag/player/", controller.TagPlayer).Methods("POST")
apiRouter.HandleFunc("/nflplayers/cut/player/{PlayerID}/", controller.CutNFLPlayerFromRoster).Methods("GET")
apiRouter.HandleFunc("/nflplayers/place/player/squad/{PlayerID}/", controller.PlaceNFLPlayerOnPracticeSquad).Methods("GET")
apiRouter.HandleFunc("/nflplayers/injury/reserve/player/{PlayerID}/", controller.PlaceNFLPlayerOnInjuryReserve).Methods("GET")
apiRouter.HandleFunc("/collegeplayers/injury/reserve/player/{PlayerID}/", controller.PlaceCFBPlayerOnInjuryReserve).Methods("GET")
apiRouter.HandleFunc("/collegeplayers/teams/export/", controller.ExportAllCFBRostersToCSV).Methods("GET") // DO NOT USE
// Poll Controls
apiRouter.HandleFunc("/college/poll/create/", controller.CreatePollSubmission).Methods("POST")
apiRouter.HandleFunc("/college/poll/sync", controller.SyncCollegePoll).Methods("GET")
apiRouter.HandleFunc("/college/poll/official/season/{seasonID}", controller.GetOfficialPollsBySeasonID).Methods("GET")
apiRouter.HandleFunc("/college/poll/submission/{username}", controller.GetPollSubmission).Methods("GET")
// Rankings Controls
// apiRouter.HandleFunc("/simfba/cfb/croots/generate/", controller.GenerateRecruits).Methods("GET")
apiRouter.HandleFunc("/rankings/assign/all/croots/", controller.AssignAllRecruitRanks).Methods("GET")
// Recruiting Controls
apiRouter.HandleFunc("/recruiting/overview/dashboard/{teamID}", controller.GetRecruitingProfileForDashboardByTeamID).Methods("GET")
// apiRouter.HandleFunc("/recruiting/profile/recalibrate/", controller.RecalibrateCrootProfiles).Methods("GET")
apiRouter.HandleFunc("/recruiting/profile/team/{teamID}/", controller.GetRecruitingProfileForTeamBoardByTeamID).Methods("GET")
apiRouter.HandleFunc("/recruiting/profile/all/", controller.GetAllRecruitingProfiles).Methods("GET")
apiRouter.HandleFunc("/recruiting/profile/only/{teamID}/", controller.GetOnlyRecruitingProfileByTeamID).Methods("GET")
apiRouter.HandleFunc("/recruiting/save/ai/", controller.ToggleAIBehavior).Methods("POST")
apiRouter.HandleFunc("/recruiting/addrecruit/", controller.CreateRecruitPlayerProfile).Methods("POST")
// apiRouter.HandleFunc("/recruiting/allocaterecruitpoints/", controller.AllocateRecruitingPointsForRecruit).Methods("PUT")
apiRouter.HandleFunc("/recruiting/toggleScholarship/", controller.SendScholarshipToRecruit).Methods("POST")
// apiRouter.HandleFunc("/recruiting/revokescholarship/", controller.RevokeScholarshipFromRecruit).Methods("PUT")
apiRouter.HandleFunc("/recruiting/removecrootfromboard/", controller.RemoveRecruitFromBoard).Methods("PUT")
apiRouter.HandleFunc("/recruiting/savecrootboard/", controller.SaveRecruitingBoard).Methods("POST")
// ReCroot Controls
apiRouter.HandleFunc("/recruits/all/", controller.AllRecruits).Methods("GET")
apiRouter.HandleFunc("/recruits/export/all/", controller.ExportCroots).Methods("GET")
// apiRouter.HandleFunc("/recruits/generate/", controller.ExportCroots).Methods("GET")
// apiRouter.HandleFunc("/recruits/juco/all/", controller.AllJUCOCollegeRecruits).Methods("GET")
apiRouter.HandleFunc("/recruits/recruit/{recruitID}/", controller.GetCollegeRecruitByRecruitID).Methods("GET")
apiRouter.HandleFunc("/recruits/profile/recruits/{recruitProfileID}/", controller.GetRecruitsByTeamProfileID).Methods("GET")
apiRouter.HandleFunc("/recruits/recruit/create", controller.CreateCollegeRecruit).Methods("POST")
// apiRouter.HandleFunc("/recruits/recruit/update/", controller.UpdateCollegeRecruit).Methods("PUT")
// Requests Controls
apiRouter.HandleFunc("/admin/requests/fba/", controller.GetFBARequests).Methods("GET")
apiRouter.HandleFunc("/requests/all/", controller.GetTeamRequests).Methods("GET")
apiRouter.HandleFunc("/requests/create/", controller.CreateTeamRequest).Methods("POST")
apiRouter.HandleFunc("/requests/approve/", controller.ApproveTeamRequest).Methods("PUT")
apiRouter.HandleFunc("/requests/reject/", controller.RejectTeamRequest).Methods("POST")
apiRouter.HandleFunc("/requests/view/cfb/{teamID}", controller.ViewCFBTeamUponRequest).Methods("GET")
apiRouter.HandleFunc("/requests/view/nfl/{teamID}", controller.ViewNFLTeamUponRequest).Methods("GET")
apiRouter.HandleFunc("/requests/remove/{teamID}", controller.RemoveUserFromTeam).Methods("GET")
apiRouter.HandleFunc("/nfl/requests/all/", controller.GetNFLTeamRequests).Methods("GET")
apiRouter.HandleFunc("/nfl/requests/create/", controller.CreateNFLTeamRequest).Methods("POST")
apiRouter.HandleFunc("/nfl/requests/approve/", controller.ApproveNFLTeamRequest).Methods("POST")
apiRouter.HandleFunc("/nfl/requests/reject/", controller.RejectNFLTeamRequest).Methods("POST")
apiRouter.HandleFunc("/nfl/requests/remove/{teamID}", controller.RemoveNFLUserFromNFLTeam).Methods("POST")
// Standings Controls
apiRouter.HandleFunc("/standings/cfb/season/{seasonID}/", controller.GetAllCollegeStandings).Methods("GET")
apiRouter.HandleFunc("/standings/cfb/{conferenceID}/{seasonID}/", controller.GetCollegeStandingsByConferenceIDAndSeasonID).Methods("GET")
apiRouter.HandleFunc("/standings/nfl/season/{seasonID}/", controller.GetAllNFLStandings).Methods("GET")
apiRouter.HandleFunc("/standings/nfl/{divisionID}/{seasonID}/", controller.GetNFLStandingsByDivisionIDAndSeasonID).Methods("GET")
apiRouter.HandleFunc("/standings/cfb/history/team/{teamID}/", controller.GetHistoricalRecordsByTeamID).Methods("GET")
// apiRouter.HandleFunc("/standings/generate/cfb/rankings/", controller.GenerateCollegeRankingsHandler).Methods("GET")
// Stats Controls
apiRouter.HandleFunc("/stats/cfb/player/{playerID}/season/{seasonID}/", controller.GetCFBSeasonStatsRecord).Methods("GET")
apiRouter.HandleFunc("/statistics/export/cfb/", controller.ExportCFBStatisticsFromSim).Methods("POST")
// apiRouter.HandleFunc("/statistics/export/nfl/", controller.ExportNFLStatisticsFromSim).Methods("POST")
apiRouter.HandleFunc("/statistics/export/players/", controller.ExportPlayerStatsToCSV).Methods("GET")
apiRouter.HandleFunc("/statistics/export/cfb/{seasonID}/{weekID}/{viewType}/{gameType}", controller.ExportCFBStatsPageContentForSeason).Methods("GET")
apiRouter.HandleFunc("/statistics/export/nfl/{seasonID}/{weekID}/{viewType}/{gameType}", controller.ExportNFLStatsPageContent).Methods("GET")
apiRouter.HandleFunc("/statistics/cfb/export/play/by/play/{gameID}", controller.ExportPlayByPlayToCSV).Methods("GET")
apiRouter.HandleFunc("/statistics/nfl/export/play/by/play/{gameID}", controller.ExportNFLPlayByPlayToCSV).Methods("GET")
apiRouter.HandleFunc("/statistics/injured/players/", controller.GetInjuryReport).Methods("GET")
apiRouter.HandleFunc("/statistics/interface/cfb/{seasonID}/{weekID}/{viewType}/{gameType}", controller.GetStatsPageContentForSeason).Methods("GET")
apiRouter.HandleFunc("/statistics/interface/nfl/{seasonID}/{weekID}/{viewType}/{gameType}", controller.GetNFLStatsPageContent).Methods("GET")
apiRouter.HandleFunc("/statistics/interface/v2/cfb/{seasonID}/{weekID}/{viewType}/{gameType}", controller.GetCFBStatsPageContent).Methods("GET")
apiRouter.HandleFunc("/statistics/interface/v2/nfl/{seasonID}/{weekID}/{viewType}/{gameType}", controller.GetProStatsPageContent).Methods("GET")
apiRouter.HandleFunc("/statistics/reset/cfb/season/", controller.ResetCFBSeasonalStats).Methods("GET")
// apiRouter.HandleFunc("/statistics/reset/nfl/season/", controller.ResetNFLSeasonalStats).Methods("GET")
apiRouter.HandleFunc("/statistics/cfb/export/crootforthecrootgod/", controller.ExportAllSpringGamesPbPToCSV).Methods("GET")
apiRouter.HandleFunc("/statistics/nfl/export/crootforthecrootgod/", controller.ExportAllPreseasonGamesPbPToCSV).Methods("GET")
apiRouter.HandleFunc("/statistics/nfl/attribute/report/", controller.NFLAttributePercentilesReport).Methods("GET")
apiRouter.HandleFunc("/statistics/cfb/attribute/report/", controller.CFBAttributePercentilesReport).Methods("GET")
// Team Controls
apiRouter.HandleFunc("/teams/college/all/", controller.GetAllCollegeTeams).Methods("GET")
apiRouter.HandleFunc("/teams/college/data/all/", controller.GetAllCollegeTeamsForRosterPage).Methods("GET")
apiRouter.HandleFunc("/teams/nfl/all/", controller.GetAllNFLTeams).Methods("GET")
apiRouter.HandleFunc("/teams/cfb/dashboard/{teamID}/", controller.GetCFBDashboardByTeamID).Methods("GET")
apiRouter.HandleFunc("/teams/nfl/dashboard/{teamID}/", controller.GetNFLDashboardByTeamID).Methods("GET")
apiRouter.HandleFunc("/teams/nfl/roster/{teamID}/", controller.GetNFLRecordsForRosterPage).Methods("GET")
apiRouter.HandleFunc("/teams/college/active/", controller.GetAllActiveCollegeTeams).Methods("GET")
apiRouter.HandleFunc("/teams/college/available/", controller.GetAllAvailableCollegeTeams).Methods("GET")
apiRouter.HandleFunc("/teams/college/team/{teamID}/", controller.GetTeamByTeamID).Methods("GET")
apiRouter.HandleFunc("/teams/college/assign/grades/", controller.AssignCFBTeamGrades).Methods("GET")
apiRouter.HandleFunc("/teams/nfl/team/{teamID}/", controller.GetNFLTeamByTeamID).Methods("GET")
apiRouter.HandleFunc("/teams/college/conference/{conferenceID}/", controller.GetTeamsByConferenceID).Methods("GET")
apiRouter.HandleFunc("/teams/college/division/{divisionID}/", controller.GetTeamsByDivisionID).Methods("GET")
apiRouter.HandleFunc("/teams/college/update/jersey/", controller.UpdateCFBJersey).Methods("POST")
apiRouter.HandleFunc("/teams/nfl/update/jersey/", controller.UpdateNFLJersey).Methods("POST")
// ENGINE CONTROLS
apiRouter.HandleFunc("/teams/college/sim/{gameID}/", controller.GetHomeAndAwayTeamData).Methods("GET")
apiRouter.HandleFunc("/teams/nfl/sim/{gameID}/", controller.GetNFLHomeAndAwayTeamData).Methods("GET")
// TEST Controls
apiRouter.HandleFunc("/gameplan/college/depthchart/test-ai/update/", controller.UpdateCollegeAIDepthChartsTEST).Methods("GET")
apiRouter.HandleFunc("/simfba/team/test/{teamID}/{off}/{def}", controller.UpdateCFBIndividualGameplanTEST).Methods("GET")
apiRouter.HandleFunc("/simfba/mass/test/{off}/{def}", controller.MassCFBUpdateGameplansTEST).Methods("GET")
apiRouter.HandleFunc("/gameplan/nfl/depthchart/test-ai/update/", controller.UpdateNFLAIDepthChartsTEST).Methods("GET")
apiRouter.HandleFunc("/simnfl/team/test/{teamID}/{off}/{def}", controller.UpdateNFLIndividualGameplanTEST).Methods("GET")
apiRouter.HandleFunc("/simnfl/mass/test/{off}/{def}", controller.MassNFLUpdateGameplansTEST).Methods("GET")
apiRouter.HandleFunc("/teams/college/test/sim/{gameID}/", controller.GetCFBHomeAndAwayTeamTestData).Methods("GET")
apiRouter.HandleFunc("/teams/nfl/test/sim/{gameID}/", controller.GetNFLHomeAndAwayTeamTestData).Methods("GET")
apiRouter.HandleFunc("/test/scheduler/cfb", controller.TestCFBScheduler).Methods("GET")
// apiRouter.HandleFunc("/teams/nfl/test/setup/", controller.SetUpNFLTestDataStructs).Methods("GET")
// apiRouter.HandleFunc("/simfba/test/cfb/progression/", controller.TestCFBProgressionAlgorithm).Methods("GET")
// apiRouter.HandleFunc("/simfba/test/nfl/progression/", controller.TestNFLProgressionAlgorithm).Methods("GET")
// Trade Controls
apiRouter.HandleFunc("/trades/nfl/all/accepted", controller.GetAllAcceptedTrades).Methods("GET")
apiRouter.HandleFunc("/trades/nfl/all/rejected", controller.GetAllRejectedTrades).Methods("GET")
apiRouter.HandleFunc("/trades/nfl/block/{teamID}", controller.GetNFLTradeBlockDataByTeamID).Methods("GET")
apiRouter.HandleFunc("/trades/nfl/place/block/{playerID}", controller.PlaceNFLPlayerOnTradeBlock).Methods("GET")
apiRouter.HandleFunc("/trades/nfl/preferences/update", controller.UpdateTradePreferences).Methods("POST")
apiRouter.HandleFunc("/trades/nfl/create/proposal", controller.CreateNFLTradeProposal).Methods("POST")
apiRouter.HandleFunc("/trades/nfl/draft/process", controller.SyncTradeFromDraftPage).Methods("POST")
apiRouter.HandleFunc("/trades/nfl/proposal/accept/{proposalID}", controller.AcceptTradeOffer).Methods("GET")
apiRouter.HandleFunc("/trades/nfl/proposal/reject/{proposalID}", controller.RejectTradeOffer).Methods("GET")
apiRouter.HandleFunc("/trades/nfl/proposal/cancel/{proposalID}", controller.CancelTradeOffer).Methods("GET")
// Training Camp
apiRouter.HandleFunc("/nfl/training/camp/{year}", controller.RunTrainingCamps).Methods("GET")
// Transfer Intentions
apiRouter.HandleFunc("/simfba/sync/transfer/intention", controller.ProcessTransferIntention).Methods("GET")
// Transfer Intentions
apiRouter.HandleFunc("/portal/transfer/intention", controller.ProcessTransferIntention).Methods("GET")
apiRouter.HandleFunc("/portal/transfer/pre/promises", controller.ProcessPrePortalPromises).Methods("GET")
apiRouter.HandleFunc("/portal/transfer/enter/portal", controller.EnterTheTransferPortal).Methods("GET")
apiRouter.HandleFunc("/portal/transfer/sync", controller.SyncTransferPortal).Methods("GET")
apiRouter.HandleFunc("/portal/promise/sync", controller.SyncPromises).Methods("GET")
apiRouter.HandleFunc("/portal/ai/generate/profiles", controller.FillUpTransferBoardsAI).Methods("GET")
apiRouter.HandleFunc("/portal/ai/allocate/profiles", controller.AllocateAndPromisePlayersAI).Methods("GET")
apiRouter.HandleFunc("/portal/page/data/{teamID}", controller.GetTransferPortalPageData).Methods("GET")
apiRouter.HandleFunc("/portal/profile/create", controller.AddTransferPlayerToBoard).Methods("POST")
apiRouter.HandleFunc("/portal/profile/remove", controller.RemovePlayerFromTransferPortalBoard).Methods("POST")
apiRouter.HandleFunc("/portal/saveboard", controller.SaveTransferBoardV2).Methods("POST")
apiRouter.HandleFunc("/portal/promise/create", controller.CreatePromise).Methods("POST")
apiRouter.HandleFunc("/portal/promise/cancel/{promiseID}", controller.CancelPromise).Methods("GET")
apiRouter.HandleFunc("/portal/promise/player/{playerID}/{teamID}", controller.GetPromiseByPlayerID).Methods("GET")
apiRouter.HandleFunc("/portal/player/scout/{id}", controller.GetScoutingDataByTransfer).Methods("GET")
apiRouter.HandleFunc("/portal/export/players/", controller.ExportPortalPlayersToCSV).Methods("GET")
// UDFA Controls
apiRouter.HandleFunc("/nfl/udfa/board/{teamID}", controller.GetUDFABoardByTeamID).Methods("GET")
apiRouter.HandleFunc("/nfl/udfa/board/add", controller.AddPlayerToUDFABoard).Methods("POST")
apiRouter.HandleFunc("/nfl/udfa/board/save", controller.SaveUDFABoard).Methods("POST")
apiRouter.HandleFunc("/nfl/udfa/board/remove/{profileID}", controller.RemovePlayerFromUDFABoard).Methods("GET")
// Discord Controls
apiRouter.HandleFunc("/ds/cfb/team/{teamID}/", controller.GetTeamByTeamIDForDiscord).Methods("GET")
apiRouter.HandleFunc("/ds/college/player/indstats/{id}/{week}/", controller.GetCollegePlayerStatsByNameTeamAndWeek).Methods("GET")
apiRouter.HandleFunc("/ds/college/player/seasonstats/{id}/", controller.GetCurrentSeasonCollegePlayerStatsByNameTeam).Methods("GET")
apiRouter.HandleFunc("/ds/college/player/careerstats/{id}/", controller.GetCareerCollegePlayerStatsByID).Methods("GET")
apiRouter.HandleFunc("/teams/ds/college/week/team/{week}/{team}/", controller.GetWeeklyTeamStatsByTeamAbbrAndWeek).Methods("GET")
apiRouter.HandleFunc("/teams/ds/college/season/team/{season}/{team}/", controller.GetSeasonTeamStatsByTeamAbbrAndSeason).Methods("GET")
apiRouter.HandleFunc("/ds/cfb/assign/discord/{teamID}/{discordID}", controller.AssignDiscordIDtoCollegeTeam).Methods("GET")
apiRouter.HandleFunc("/ds/cfb/player/id/{id}", controller.GetCollegePlayer).Methods("GET")
apiRouter.HandleFunc("/ds/cfb/player/name/{firstName}/{lastName}/{abbr}", controller.GetCollegePlayerByName).Methods("GET")
apiRouter.HandleFunc("/ds/nfl/player/id/{id}", controller.GetNFLPlayer).Methods("GET")
apiRouter.HandleFunc("/ds/nfl/player/name/{firstName}/{lastName}/{abbr}", controller.GetNFLPlayerByName).Methods("GET")
apiRouter.HandleFunc("/ds/nfl/player/careerstats/{id}", controller.GetNFLPlayerCareer).Methods("GET")
apiRouter.HandleFunc("/ds/nfl/assign/discord/{teamID}/{discordID}", controller.AssignDiscordIDtoNFLTeam).Methods("GET")
apiRouter.HandleFunc("/ds/cfb/croots/class/{teamID}/", controller.GetRecruitingClassByTeamID).Methods("GET")
apiRouter.HandleFunc("/ds/cfb/croot/{id}", controller.GetRecruitViaDiscord).Methods("GET")
apiRouter.HandleFunc("/schedule/ds/current/week/{league}/", controller.GetCurrentWeekGamesByLeague).Methods("GET")
apiRouter.HandleFunc("/ds/cfb/flex/{teamOneID}/{teamTwoID}/", controller.CompareCFBTeams).Methods("GET")
apiRouter.HandleFunc("/ds/nfl/flex/{teamOneID}/{teamTwoID}/", controller.CompareNFLTeams).Methods("GET")
apiRouter.HandleFunc("/ds/cfb/conference/{conference}/", controller.GetCollegeConferenceStandings).Methods("GET")
apiRouter.HandleFunc("/ds/cfb/fbs/stream/{timeslot}/", controller.GetFBSGameStreams).Methods("GET")
apiRouter.HandleFunc("/ds/cfb/fcs/stream/{timeslot}/", controller.GetFCSGameStreams).Methods("GET")
apiRouter.HandleFunc("/ds/nfl/league/stream/{timeslot}/", controller.GetNFLGameStreams).Methods("GET")
apiRouter.HandleFunc("/ds/cfb/reveal/results/{gameID}/", controller.RevealCFBGameResults).Methods("GET")
apiRouter.HandleFunc("/ds/nfl/reveal/results/{gameID}/", controller.RevealNFLGameResults).Methods("GET")
// Easter Controls
apiRouter.HandleFunc("/easter/egg/collude/", controller.CollusionButton).Methods("POST")
// --- NEW LIVE SCOREBOARD ROUTES ADDED HERE ---
apiRouter.HandleFunc("/games/plays/bulk/cfb", controller.GetBulkPlayByPlay).Methods("GET")
apiRouter.HandleFunc("/games/plays/bulk/nfl", controller.GetBulkPlayByPlay).Methods("GET")
apiRouter.HandleFunc("/games/fb/games/stream/queue/{league}", controller.GetFBGameQueue).Methods("GET")
apiRouter.HandleFunc("/games/cfb/live-plays/test/", controller.TestCFBCronJob).Methods("GET")
apiRouter.HandleFunc("/games/nfl/live-plays/test/", controller.TestNFLCronJob).Methods("GET")
// Firebase test endpoints
apiRouter.HandleFunc("/firebase/test/notification/", controller.TestNotificationToTuscan).Methods("GET")
// apiRouter.HandleFunc("/firebase/test/forum/", controller.TestForumPost).Methods("GET")
// ImageKit upload authentication
apiRouter.HandleFunc("/imagekit/auth/", controller.GetImageKitAuth).Methods("GET")
// Websocket
myRouter.HandleFunc("/ws", ws.WebSocketHandler)
// log.Fatal(http.ListenAndServe(":5001", handler))
return handlers.CORS(originsOk, headersOk, methodsOk)(myRouter)
}
func loadEnvs() {
err := godotenv.Load(".env")
if err != nil {
fmt.Println("CANNOT LOAD ENV VARIABLES")
}
}
func handleCron() *cron.Cron {
c := cron.New(cron.WithLocation(time.UTC))
runJobs := os.Getenv("RUN_JOBS")
if runJobs != "false" {
// Fill AI Recruiting Boards
c.AddFunc("0 5 * * 4", controller.FillAIBoardsViaCron)
// Update AI Gameplans and DCs
c.AddFunc("0 1 * * 3", controller.RunAISchemeAndDCViaCron)
c.AddFunc("0 4 * * 3", controller.RunAIGameplanViaCron)
// Allocate AI Boards
c.AddFunc("0 3 * * 4,6", controller.SyncAIBoardsViaCron)
// Run RES
c.AddFunc("0 7 * * 4", controller.RunRESViaCron)
// Sync Recruiting
c.AddFunc("0 16 * * 3", controller.SyncRecruitingViaCron)
// Sync Free Agency
c.AddFunc("0 16 * * *", controller.SyncFreeAgencyViaCron)
// Sync Extension Offers
// Run the Games
c.AddFunc("0 4 * * 4", controller.RunTheGamesViaCron)
// Reveal Timeslot Results
c.AddFunc("0 22 * * 4", controller.ShowCFBThursdayViaCron) // Thurs Night
c.AddFunc("0 21 * * 4", controller.ShowNFLThursdayViaCron) // Thurs NFL
c.AddFunc("0 22 * * 5", controller.ShowCFBFridayViaCron) // Fri Night
c.AddFunc("0 16 * * 6", controller.ShowCFBSatMornViaCron) // Sat. Morning
c.AddFunc("0 18 * * 6", controller.ShowCFBSatAftViaCron) // Sat. Afternoon
c.AddFunc("0 20 * * 6", controller.ShowCFBSatEveViaCron) // Sat. Evening
c.AddFunc("0 22 * * 6", controller.ShowCFBSatNitViaCron) // Sat. Night
c.AddFunc("0 16 * * 0", controller.ShowNFLSunNoonViaCron) // Sun Noon
c.AddFunc("0 18 * * 0", controller.ShowNFLSunAftViaCron) // Sun Aft
c.AddFunc("0 20 * * 0", controller.ShowNFLSunNitViaCron) // Sun Nit
c.AddFunc("0 17 * * 1", controller.ShowNFLMonNitViaCron) // Mon Nit
// Sync Week
c.AddFunc("0 18 * * 1", controller.SyncToNextWeekViaCron)
c.AddFunc("0 2 * * 2", controller.SyncPhaseTuesdayViaCron)
c.AddFunc("0 2 * * 3", controller.SyncPhaseWednesdayViaCron)
c.AddFunc("0 2 * * 4", controller.SyncPhaseThursdayViaCron)
c.AddFunc("0 2 * * 5", controller.SyncPhaseFridayViaCron)
// Live Stream
c.AddFunc("30 16 * * 4", controller.StreamCFBThursdayGamesToInterfaceViaCron)
c.AddFunc("30 16 * * 5", controller.StreamCFBFridayGamesToInterfaceViaCron)
c.AddFunc("30 15 * * 6", controller.StreamCFBSaturdayGamesToInterfaceViaCron)
c.AddFunc("30 17 * * 4", controller.StreamNFLThursdayGamesToInterfaceViaCron)
c.AddFunc("0 17 * * 0", controller.StreamNFLSundayGamesToInterfaceViaCron)
c.AddFunc("0 15 * * 1", controller.StreamNFLMondayGamesToInterfaceViaCron)
}
c.Start()
return c
}
func main() {
loadEnvs()
InitialMigration()
fmt.Println("Setting up polling...")
go monitorDBForUpdates()
fmt.Println("Loading cron...")
cronJobs := handleCron()
fmt.Println("Loading Handler Requests.")
fmt.Println("Football Server Initialized.")
srv := &http.Server{
Addr: ":5001",
Handler: handleRequests(),
}
go func() {
fmt.Println("Server starting on port 5001")
if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
log.Fatalf("Could not listen on %s: %v\n", srv.Addr, err)
}
}()
// Create a channel to listen for system interrupts (Ctrl+C, etc.)
quit := make(chan os.Signal, 1)
signal.Notify(quit, os.Interrupt, syscall.SIGTERM)
// Block until a signal is received
<-quit
fmt.Println("Shutting down server...")
// Gracefully shutdown the server with a timeout of 5 seconds
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
// Stop cron jobs
cronJobs.Stop()
// Shutdown the server
if err := srv.Shutdown(ctx); err != nil {
log.Fatalf("Server forced to shutdown: %v", err)
}
fmt.Println("Server exiting")
}