Add OpenAPI docs, frontend, migrations, and API updates

- OpenAPI: add missing endpoints (add-from-url, subscriptions, public availability)
- OpenAPI: CalendarSubscription schema, Subscriptions tag
- Frontend app
- Migrations: count_for_availability, subscriptions_sync, user_preferences, calendar_settings
- Config, rate limit, auth, calendar, booking, ICS, availability, user service updates

Made-with: Cursor
This commit is contained in:
Michilis
2026-03-02 14:07:55 +00:00
parent 2cb9d72a7f
commit 75105b8b46
8120 changed files with 1486881 additions and 314 deletions

View File

@@ -45,28 +45,40 @@ func main() {
queries := repository.New(pool)
jwtManager := auth.NewJWTManager(cfg.JWTSecret)
auditSvc := service.NewAuditService(queries)
calSvc := service.NewCalendarService(pool, queries, auditSvc, cfg.BaseURL)
var sched service.ReminderScheduler
if cfg.RedisAddr != "" {
realSched := scheduler.NewScheduler(cfg.RedisAddr)
sched = scheduler.NewScheduler(cfg.RedisAddr)
} else {
sched = scheduler.NoopScheduler{}
}
if realSched, ok := sched.(*scheduler.Scheduler); ok {
defer realSched.Close()
sched = realSched
}
eventSvc := service.NewEventService(pool, queries, calSvc, auditSvc, sched)
if cfg.RedisAddr != "" {
realSched := sched.(*scheduler.Scheduler)
icsHandler := handlers.NewICSHandler(calSvc, eventSvc, queries)
subSyncWorker := scheduler.NewSubscriptionSyncWorker(icsHandler)
worker := scheduler.NewReminderWorker(queries)
asynqSrv := scheduler.StartWorker(cfg.RedisAddr, worker)
asynqSrv := scheduler.StartWorker(cfg.RedisAddr, worker, subSyncWorker)
defer asynqSrv.Shutdown()
enqueuerCtx, enqueuerCancel := context.WithCancel(context.Background())
defer enqueuerCancel()
go scheduler.StartSubscriptionEnqueuer(enqueuerCtx, queries, realSched, 15*time.Minute)
log.Println("Redis connected, background jobs enabled")
} else {
sched = scheduler.NoopScheduler{}
log.Println("Redis not configured, background jobs disabled")
}
auditSvc := service.NewAuditService(queries)
authSvc := service.NewAuthService(pool, queries, jwtManager, auditSvc)
userSvc := service.NewUserService(pool, queries, auditSvc)
calSvc := service.NewCalendarService(pool, queries, auditSvc, cfg.BaseURL)
eventSvc := service.NewEventService(pool, queries, calSvc, auditSvc, sched)
contactSvc := service.NewContactService(queries, auditSvc)
availSvc := service.NewAvailabilityService(queries, calSvc, eventSvc)
bookingSvc := service.NewBookingService(pool, queries, calSvc, eventSvc)
@@ -90,9 +102,9 @@ func main() {
}
authMW := middleware.NewAuthMiddleware(jwtManager, queries)
rateLimiter := middleware.NewRateLimiter(100, 200)
rateLimiter := middleware.NewRateLimiter(cfg.RateLimitRPS, cfg.RateLimitBurst)
router := api.NewRouter(h, authMW, rateLimiter)
router := api.NewRouter(h, authMW, rateLimiter, cfg)
srv := &http.Server{
Addr: ":" + cfg.ServerPort,