package app import ( "clapclap/internal/auth/jwt" "clapclap/internal/auth/oauth2" "clapclap/internal/auth/password" "clapclap/internal/vault" "sync/atomic" "github.com/gin-gonic/gin" "github.com/aws/aws-sdk-go-v2/service/s3" "gorm.io/gorm" ) // TODO (pipo) : multi-router app type App struct { // Gin Router Port string Router *gin.Engine // Connections Database atomic.Value // holds *gorm.DB S3Internal *s3.Client S3 *s3.Client Vault *vault.Manager // Authenticators FtAuth oauth2.Authenticator JwtAccessAuth jwt.Authenticator JwtRefreshAuth jwt.Authenticator EmailTokenAuth jwt.Authenticator PasswordResetAuth jwt.Authenticator PasswordAuth password.Authenticator // Issuers JwtAccessIssuer jwt.Issuer JwtRefreshIssuer jwt.Issuer JwtRefreshRemover jwt.Issuer } func (a App) GetDB() *gorm.DB { db := a.Database.Load() if db == nil { return nil } return db.(*gorm.DB) } func (a *App) SwapDB(db *gorm.DB) *gorm.DB { old := a.Database.Swap(db) if old == nil { return nil } return old.(*gorm.DB) } func (a *App) String() string { // use a.Router.Routes() return "" } func New(port string) *App { app := &App{Port: port} return app } func (app *App) Run() { app.Router.Run(":" + app.Port) }