From 785200de61deb1544aac5ff6f914a35e27632bbc Mon Sep 17 00:00:00 2001 From: Elias Schneider Date: Fri, 3 Jan 2025 15:08:55 +0100 Subject: [PATCH] chore: include static assets in binary --- Dockerfile | 3 -- .../bootstrap/application_images_bootstrap.go | 10 +++--- backend/internal/bootstrap/db_bootstrap.go | 27 ++++++++++++---- .../internal/bootstrap/router_bootstrap.go | 4 +-- backend/internal/common/env_config.go | 2 -- backend/internal/service/email_service.go | 7 ++-- backend/internal/service/test_service.go | 16 ++++++++-- .../utils/email/email_service_templates.go | 30 ++++++++++-------- backend/internal/utils/file_util.go | 24 ++------------ .../components/email_html.tmpl | 0 .../components/email_text.tmpl | 0 .../components/style_html.tmpl | 0 .../login-with-new-device_html.tmpl | 0 .../login-with-new-device_text.tmpl | 0 .../email-templates/test_html.tmpl | 0 .../email-templates/test_text.tmpl | 0 backend/resources/files.go | 8 +++++ backend/{ => resources}/images/background.jpg | Bin backend/{ => resources}/images/favicon.ico | Bin backend/{ => resources}/images/logo.svg | 0 backend/{ => resources}/images/logoDark.svg | 0 backend/{ => resources}/images/logoLight.svg | 0 .../postgres/20241211111554_init.up.sql | 0 .../sqlite/20240731203656_init.up.sql | 0 ...0240813211251_passkey_backup_flags..up.sql | 0 ...240813211251_passkey_backup_flags.down.sql | 0 ...0240817191051_rename_config_table.down.sql | 0 .../20240817191051_rename_config_table.up.sql | 0 ...0820205521_multiple_callback_urls.down.sql | 0 ...240820205521_multiple_callback_urls.up.sql | 0 .../sqlite/20240908123031_audit_log.down.sql | 0 .../sqlite/20240908123031_audit_log.up.sql | 0 .../20240924202721_user_groups.down.sql | 0 .../sqlite/20240924202721_user_groups.up.sql | 0 ...20241004092030_audit_log_location.down.sql | 0 .../20241004092030_audit_log_location.up.sql | 0 .../20241023072742_unix-timestamps.down.sql | 0 .../20241023072742_unix-timestamps.up.sql | 0 ...25214824_app_config_default_value.down.sql | 0 ...1025214824_app_config_default_value.up.sql | 0 .../20241028064959_custom_claims.down.sql | 0 .../20241028064959_custom_claims.up.sql | 0 .../sqlite/20241115131129_pkce.down.sql | 0 .../sqlite/20241115131129_pkce.up.sql | 0 44 files changed, 71 insertions(+), 60 deletions(-) rename backend/{ => resources}/email-templates/components/email_html.tmpl (100%) rename backend/{ => resources}/email-templates/components/email_text.tmpl (100%) rename backend/{ => resources}/email-templates/components/style_html.tmpl (100%) rename backend/{ => resources}/email-templates/login-with-new-device_html.tmpl (100%) rename backend/{ => resources}/email-templates/login-with-new-device_text.tmpl (100%) rename backend/{ => resources}/email-templates/test_html.tmpl (100%) rename backend/{ => resources}/email-templates/test_text.tmpl (100%) create mode 100644 backend/resources/files.go rename backend/{ => resources}/images/background.jpg (100%) rename backend/{ => resources}/images/favicon.ico (100%) rename backend/{ => resources}/images/logo.svg (100%) rename backend/{ => resources}/images/logoDark.svg (100%) rename backend/{ => resources}/images/logoLight.svg (100%) rename backend/{ => resources}/migrations/postgres/20241211111554_init.up.sql (100%) rename backend/{ => resources}/migrations/sqlite/20240731203656_init.up.sql (100%) rename backend/{ => resources}/migrations/sqlite/20240813211251_passkey_backup_flags..up.sql (100%) rename backend/{ => resources}/migrations/sqlite/20240813211251_passkey_backup_flags.down.sql (100%) rename backend/{ => resources}/migrations/sqlite/20240817191051_rename_config_table.down.sql (100%) rename backend/{ => resources}/migrations/sqlite/20240817191051_rename_config_table.up.sql (100%) rename backend/{ => resources}/migrations/sqlite/20240820205521_multiple_callback_urls.down.sql (100%) rename backend/{ => resources}/migrations/sqlite/20240820205521_multiple_callback_urls.up.sql (100%) rename backend/{ => resources}/migrations/sqlite/20240908123031_audit_log.down.sql (100%) rename backend/{ => resources}/migrations/sqlite/20240908123031_audit_log.up.sql (100%) rename backend/{ => resources}/migrations/sqlite/20240924202721_user_groups.down.sql (100%) rename backend/{ => resources}/migrations/sqlite/20240924202721_user_groups.up.sql (100%) rename backend/{ => resources}/migrations/sqlite/20241004092030_audit_log_location.down.sql (100%) rename backend/{ => resources}/migrations/sqlite/20241004092030_audit_log_location.up.sql (100%) rename backend/{ => resources}/migrations/sqlite/20241023072742_unix-timestamps.down.sql (100%) rename backend/{ => resources}/migrations/sqlite/20241023072742_unix-timestamps.up.sql (100%) rename backend/{ => resources}/migrations/sqlite/20241025214824_app_config_default_value.down.sql (100%) rename backend/{ => resources}/migrations/sqlite/20241025214824_app_config_default_value.up.sql (100%) rename backend/{ => resources}/migrations/sqlite/20241028064959_custom_claims.down.sql (100%) rename backend/{ => resources}/migrations/sqlite/20241028064959_custom_claims.up.sql (100%) rename backend/{ => resources}/migrations/sqlite/20241115131129_pkce.down.sql (100%) rename backend/{ => resources}/migrations/sqlite/20241115131129_pkce.up.sql (100%) diff --git a/Dockerfile b/Dockerfile index 6346055..ce93ef1 100644 --- a/Dockerfile +++ b/Dockerfile @@ -33,9 +33,6 @@ COPY --from=frontend-builder /app/frontend/node_modules ./frontend/node_modules COPY --from=frontend-builder /app/frontend/package.json ./frontend/package.json COPY --from=backend-builder /app/backend/pocket-id-backend ./backend/pocket-id-backend -COPY --from=backend-builder /app/backend/migrations ./backend/migrations -COPY --from=backend-builder /app/backend/email-templates ./backend/email-templates -COPY --from=backend-builder /app/backend/images ./backend/images COPY ./scripts ./scripts RUN chmod +x ./scripts/*.sh diff --git a/backend/internal/bootstrap/application_images_bootstrap.go b/backend/internal/bootstrap/application_images_bootstrap.go index 556c5fe..c8cc8a2 100644 --- a/backend/internal/bootstrap/application_images_bootstrap.go +++ b/backend/internal/bootstrap/application_images_bootstrap.go @@ -3,8 +3,10 @@ package bootstrap import ( "github.com/stonith404/pocket-id/backend/internal/common" "github.com/stonith404/pocket-id/backend/internal/utils" + "github.com/stonith404/pocket-id/backend/resources" "log" "os" + "path" "strings" ) @@ -12,7 +14,7 @@ import ( func initApplicationImages() { dirPath := common.EnvConfig.UploadPath + "/application-images" - sourceFiles, err := os.ReadDir("./images") + sourceFiles, err := resources.FS.ReadDir("images") if err != nil && !os.IsNotExist(err) { log.Fatalf("Error reading directory: %v", err) } @@ -27,10 +29,10 @@ func initApplicationImages() { if sourceFile.IsDir() || imageAlreadyExists(sourceFile.Name(), destinationFiles) { continue } - srcFilePath := "./images/" + sourceFile.Name() - destFilePath := dirPath + "/" + sourceFile.Name() + srcFilePath := path.Join("images", sourceFile.Name()) + destFilePath := path.Join(dirPath, sourceFile.Name()) - err := utils.CopyFile(srcFilePath, destFilePath) + err := utils.CopyEmbeddedFileToDisk(srcFilePath, destFilePath) if err != nil { log.Fatalf("Error copying file: %v", err) } diff --git a/backend/internal/bootstrap/db_bootstrap.go b/backend/internal/bootstrap/db_bootstrap.go index bf298e4..74a638e 100644 --- a/backend/internal/bootstrap/db_bootstrap.go +++ b/backend/internal/bootstrap/db_bootstrap.go @@ -7,7 +7,9 @@ import ( "github.com/golang-migrate/migrate/v4/database" postgresMigrate "github.com/golang-migrate/migrate/v4/database/postgres" sqliteMigrate "github.com/golang-migrate/migrate/v4/database/sqlite3" + "github.com/golang-migrate/migrate/v4/source/iofs" "github.com/stonith404/pocket-id/backend/internal/common" + "github.com/stonith404/pocket-id/backend/resources" "gorm.io/driver/postgres" "gorm.io/driver/sqlite" "gorm.io/gorm" @@ -42,20 +44,31 @@ func newDatabase() (db *gorm.DB) { } // Run migrations - m, err := migrate.NewWithDatabaseInstance( - "file://migrations/"+string(common.EnvConfig.DbProvider), - "pocket-id", driver, - ) + if err := migrateDatabase(driver); err != nil { + log.Fatalf("failed to run migrations: %v", err) + } + + return db +} + +func migrateDatabase(driver database.Driver) error { + // Use the embedded migrations + source, err := iofs.New(resources.FS, "migrations/"+string(common.EnvConfig.DbProvider)) if err != nil { - log.Fatalf("failed to create migration instance: %v", err) + return fmt.Errorf("failed to create embedded migration source: %v", err) + } + + m, err := migrate.NewWithInstance("iofs", source, "pocket-id", driver) + if err != nil { + return fmt.Errorf("failed to create migration instance: %v", err) } err = m.Up() if err != nil && !errors.Is(err, migrate.ErrNoChange) { - log.Fatalf("failed to apply migrations: %v", err) + return fmt.Errorf("failed to apply migrations: %v", err) } - return db + return nil } func connectDatabase() (db *gorm.DB, err error) { diff --git a/backend/internal/bootstrap/router_bootstrap.go b/backend/internal/bootstrap/router_bootstrap.go index 93e4296..ba47459 100644 --- a/backend/internal/bootstrap/router_bootstrap.go +++ b/backend/internal/bootstrap/router_bootstrap.go @@ -2,7 +2,6 @@ package bootstrap import ( "log" - "os" "time" "github.com/gin-gonic/gin" @@ -29,8 +28,7 @@ func initRouter(db *gorm.DB, appConfigService *service.AppConfigService) { r.Use(gin.Logger()) // Initialize services - templateDir := os.DirFS(common.EnvConfig.EmailTemplatesPath) - emailService, err := service.NewEmailService(appConfigService, db, templateDir) + emailService, err := service.NewEmailService(appConfigService, db) if err != nil { log.Fatalf("Unable to create email service: %s", err) } diff --git a/backend/internal/common/env_config.go b/backend/internal/common/env_config.go index d441146..b992c98 100644 --- a/backend/internal/common/env_config.go +++ b/backend/internal/common/env_config.go @@ -22,7 +22,6 @@ type EnvConfigSchema struct { UploadPath string `env:"UPLOAD_PATH"` Port string `env:"BACKEND_PORT"` Host string `env:"HOST"` - EmailTemplatesPath string `env:"EMAIL_TEMPLATES_PATH"` MaxMindLicenseKey string `env:"MAXMIND_LICENSE_KEY"` GeoLiteDBPath string `env:"GEOLITE_DB_PATH"` } @@ -36,7 +35,6 @@ var EnvConfig = &EnvConfigSchema{ AppURL: "http://localhost", Port: "8080", Host: "localhost", - EmailTemplatesPath: "./email-templates", MaxMindLicenseKey: "", GeoLiteDBPath: "data/GeoLite2-City.mmdb", } diff --git a/backend/internal/service/email_service.go b/backend/internal/service/email_service.go index 51bdb84..5b4dc3a 100644 --- a/backend/internal/service/email_service.go +++ b/backend/internal/service/email_service.go @@ -10,7 +10,6 @@ import ( "github.com/stonith404/pocket-id/backend/internal/utils/email" "gorm.io/gorm" htemplate "html/template" - "io/fs" "mime/multipart" "mime/quotedprintable" "net" @@ -26,13 +25,13 @@ type EmailService struct { textTemplates map[string]*ttemplate.Template } -func NewEmailService(appConfigService *AppConfigService, db *gorm.DB, templateDir fs.FS) (*EmailService, error) { - htmlTemplates, err := email.PrepareHTMLTemplates(templateDir, emailTemplatesPaths) +func NewEmailService(appConfigService *AppConfigService, db *gorm.DB) (*EmailService, error) { + htmlTemplates, err := email.PrepareHTMLTemplates(emailTemplatesPaths) if err != nil { return nil, fmt.Errorf("prepare html templates: %w", err) } - textTemplates, err := email.PrepareTextTemplates(templateDir, emailTemplatesPaths) + textTemplates, err := email.PrepareTextTemplates(emailTemplatesPaths) if err != nil { return nil, fmt.Errorf("prepare html templates: %w", err) } diff --git a/backend/internal/service/test_service.go b/backend/internal/service/test_service.go index 6bbb87f..367e6e2 100644 --- a/backend/internal/service/test_service.go +++ b/backend/internal/service/test_service.go @@ -7,8 +7,10 @@ import ( "fmt" "github.com/fxamacker/cbor/v2" "github.com/stonith404/pocket-id/backend/internal/model/types" + "github.com/stonith404/pocket-id/backend/resources" "log" "os" + "path/filepath" "time" "github.com/go-webauthn/webauthn/protocol" @@ -245,11 +247,21 @@ func (s *TestService) ResetApplicationImages() error { return err } - if err := utils.CopyDirectory("./images", common.EnvConfig.UploadPath+"/application-images"); err != nil { - log.Printf("Error copying directory: %v", err) + files, err := resources.FS.ReadDir("images") + if err != nil { return err } + for _, file := range files { + srcFilePath := filepath.Join("images", file.Name()) + destFilePath := filepath.Join(common.EnvConfig.UploadPath, "application-images", file.Name()) + + err := utils.CopyEmbeddedFileToDisk(srcFilePath, destFilePath) + if err != nil { + return err + } + } + return nil } diff --git a/backend/internal/utils/email/email_service_templates.go b/backend/internal/utils/email/email_service_templates.go index f5ce4cc..2701a03 100644 --- a/backend/internal/utils/email/email_service_templates.go +++ b/backend/internal/utils/email/email_service_templates.go @@ -2,6 +2,7 @@ package email import ( "fmt" + "github.com/stonith404/pocket-id/backend/resources" htemplate "html/template" "io/fs" "path" @@ -35,36 +36,37 @@ type pareseable[V any] interface { ParseFS(fs.FS, ...string) (V, error) } -func prepareTemplate[V pareseable[V]](template string, rootTemplate clonable[V], templateDir fs.FS, suffix string) (V, error) { +func prepareTemplate[V pareseable[V]](templateFS fs.FS, template string, rootTemplate clonable[V], suffix string) (V, error) { tmpl, err := rootTemplate.Clone() if err != nil { - return *new(V), fmt.Errorf("clone root html template: %w", err) + return *new(V), fmt.Errorf("clone root template: %w", err) } filename := fmt.Sprintf("%s%s", template, suffix) - _, err = tmpl.ParseFS(templateDir, filename) + templatePath := path.Join("email-templates", filename) + _, err = tmpl.ParseFS(templateFS, templatePath) if err != nil { - return *new(V), fmt.Errorf("parsing html template '%s': %w", template, err) + return *new(V), fmt.Errorf("parsing template '%s': %w", template, err) } return tmpl, nil } -func PrepareTextTemplates(templateDir fs.FS, templates []string) (map[string]*ttemplate.Template, error) { - components := path.Join(templateComponentsDir, "*_text.tmpl") - rootTmpl, err := ttemplate.ParseFS(templateDir, components) +func PrepareTextTemplates(templates []string) (map[string]*ttemplate.Template, error) { + components := path.Join("email-templates", "components", "*_text.tmpl") + rootTmpl, err := ttemplate.ParseFS(resources.FS, components) if err != nil { return nil, fmt.Errorf("unable to parse templates '%s': %w", components, err) } - var textTemplates = make(map[string]*ttemplate.Template, len(templates)) + textTemplates := make(map[string]*ttemplate.Template, len(templates)) for _, tmpl := range templates { rootTmplClone, err := rootTmpl.Clone() if err != nil { return nil, fmt.Errorf("clone root template: %w", err) } - textTemplates[tmpl], err = prepareTemplate[*ttemplate.Template](tmpl, rootTmplClone, templateDir, "_text.tmpl") + textTemplates[tmpl], err = prepareTemplate[*ttemplate.Template](resources.FS, tmpl, rootTmplClone, "_text.tmpl") if err != nil { return nil, fmt.Errorf("parse '%s': %w", tmpl, err) } @@ -73,21 +75,21 @@ func PrepareTextTemplates(templateDir fs.FS, templates []string) (map[string]*tt return textTemplates, nil } -func PrepareHTMLTemplates(templateDir fs.FS, templates []string) (map[string]*htemplate.Template, error) { - components := path.Join(templateComponentsDir, "*_html.tmpl") - rootTmpl, err := htemplate.ParseFS(templateDir, components) +func PrepareHTMLTemplates(templates []string) (map[string]*htemplate.Template, error) { + components := path.Join("email-templates", "components", "*_html.tmpl") + rootTmpl, err := htemplate.ParseFS(resources.FS, components) if err != nil { return nil, fmt.Errorf("unable to parse templates '%s': %w", components, err) } - var htmlTemplates = make(map[string]*htemplate.Template, len(templates)) + htmlTemplates := make(map[string]*htemplate.Template, len(templates)) for _, tmpl := range templates { rootTmplClone, err := rootTmpl.Clone() if err != nil { return nil, fmt.Errorf("clone root template: %w", err) } - htmlTemplates[tmpl], err = prepareTemplate[*htemplate.Template](tmpl, rootTmplClone, templateDir, "_html.tmpl") + htmlTemplates[tmpl], err = prepareTemplate[*htemplate.Template](resources.FS, tmpl, rootTmplClone, "_html.tmpl") if err != nil { return nil, fmt.Errorf("parse '%s': %w", tmpl, err) } diff --git a/backend/internal/utils/file_util.go b/backend/internal/utils/file_util.go index daa23b4..fc258e7 100644 --- a/backend/internal/utils/file_util.go +++ b/backend/internal/utils/file_util.go @@ -1,6 +1,7 @@ package utils import ( + "github.com/stonith404/pocket-id/backend/resources" "io" "mime/multipart" "os" @@ -28,27 +29,8 @@ func GetImageMimeType(ext string) string { } } -func CopyDirectory(srcDir, destDir string) error { - files, err := os.ReadDir(srcDir) - if err != nil { - return err - } - - for _, file := range files { - srcFilePath := filepath.Join(srcDir, file.Name()) - destFilePath := filepath.Join(destDir, file.Name()) - - err := CopyFile(srcFilePath, destFilePath) - if err != nil { - return err - } - } - - return nil -} - -func CopyFile(srcFilePath, destFilePath string) error { - srcFile, err := os.Open(srcFilePath) +func CopyEmbeddedFileToDisk(srcFilePath, destFilePath string) error { + srcFile, err := resources.FS.Open(srcFilePath) if err != nil { return err } diff --git a/backend/email-templates/components/email_html.tmpl b/backend/resources/email-templates/components/email_html.tmpl similarity index 100% rename from backend/email-templates/components/email_html.tmpl rename to backend/resources/email-templates/components/email_html.tmpl diff --git a/backend/email-templates/components/email_text.tmpl b/backend/resources/email-templates/components/email_text.tmpl similarity index 100% rename from backend/email-templates/components/email_text.tmpl rename to backend/resources/email-templates/components/email_text.tmpl diff --git a/backend/email-templates/components/style_html.tmpl b/backend/resources/email-templates/components/style_html.tmpl similarity index 100% rename from backend/email-templates/components/style_html.tmpl rename to backend/resources/email-templates/components/style_html.tmpl diff --git a/backend/email-templates/login-with-new-device_html.tmpl b/backend/resources/email-templates/login-with-new-device_html.tmpl similarity index 100% rename from backend/email-templates/login-with-new-device_html.tmpl rename to backend/resources/email-templates/login-with-new-device_html.tmpl diff --git a/backend/email-templates/login-with-new-device_text.tmpl b/backend/resources/email-templates/login-with-new-device_text.tmpl similarity index 100% rename from backend/email-templates/login-with-new-device_text.tmpl rename to backend/resources/email-templates/login-with-new-device_text.tmpl diff --git a/backend/email-templates/test_html.tmpl b/backend/resources/email-templates/test_html.tmpl similarity index 100% rename from backend/email-templates/test_html.tmpl rename to backend/resources/email-templates/test_html.tmpl diff --git a/backend/email-templates/test_text.tmpl b/backend/resources/email-templates/test_text.tmpl similarity index 100% rename from backend/email-templates/test_text.tmpl rename to backend/resources/email-templates/test_text.tmpl diff --git a/backend/resources/files.go b/backend/resources/files.go new file mode 100644 index 0000000..9ef5328 --- /dev/null +++ b/backend/resources/files.go @@ -0,0 +1,8 @@ +package resources + +import "embed" + +// Embedded file systems for the project + +//go:embed email-templates images migrations +var FS embed.FS diff --git a/backend/images/background.jpg b/backend/resources/images/background.jpg similarity index 100% rename from backend/images/background.jpg rename to backend/resources/images/background.jpg diff --git a/backend/images/favicon.ico b/backend/resources/images/favicon.ico similarity index 100% rename from backend/images/favicon.ico rename to backend/resources/images/favicon.ico diff --git a/backend/images/logo.svg b/backend/resources/images/logo.svg similarity index 100% rename from backend/images/logo.svg rename to backend/resources/images/logo.svg diff --git a/backend/images/logoDark.svg b/backend/resources/images/logoDark.svg similarity index 100% rename from backend/images/logoDark.svg rename to backend/resources/images/logoDark.svg diff --git a/backend/images/logoLight.svg b/backend/resources/images/logoLight.svg similarity index 100% rename from backend/images/logoLight.svg rename to backend/resources/images/logoLight.svg diff --git a/backend/migrations/postgres/20241211111554_init.up.sql b/backend/resources/migrations/postgres/20241211111554_init.up.sql similarity index 100% rename from backend/migrations/postgres/20241211111554_init.up.sql rename to backend/resources/migrations/postgres/20241211111554_init.up.sql diff --git a/backend/migrations/sqlite/20240731203656_init.up.sql b/backend/resources/migrations/sqlite/20240731203656_init.up.sql similarity index 100% rename from backend/migrations/sqlite/20240731203656_init.up.sql rename to backend/resources/migrations/sqlite/20240731203656_init.up.sql diff --git a/backend/migrations/sqlite/20240813211251_passkey_backup_flags..up.sql b/backend/resources/migrations/sqlite/20240813211251_passkey_backup_flags..up.sql similarity index 100% rename from backend/migrations/sqlite/20240813211251_passkey_backup_flags..up.sql rename to backend/resources/migrations/sqlite/20240813211251_passkey_backup_flags..up.sql diff --git a/backend/migrations/sqlite/20240813211251_passkey_backup_flags.down.sql b/backend/resources/migrations/sqlite/20240813211251_passkey_backup_flags.down.sql similarity index 100% rename from backend/migrations/sqlite/20240813211251_passkey_backup_flags.down.sql rename to backend/resources/migrations/sqlite/20240813211251_passkey_backup_flags.down.sql diff --git a/backend/migrations/sqlite/20240817191051_rename_config_table.down.sql b/backend/resources/migrations/sqlite/20240817191051_rename_config_table.down.sql similarity index 100% rename from backend/migrations/sqlite/20240817191051_rename_config_table.down.sql rename to backend/resources/migrations/sqlite/20240817191051_rename_config_table.down.sql diff --git a/backend/migrations/sqlite/20240817191051_rename_config_table.up.sql b/backend/resources/migrations/sqlite/20240817191051_rename_config_table.up.sql similarity index 100% rename from backend/migrations/sqlite/20240817191051_rename_config_table.up.sql rename to backend/resources/migrations/sqlite/20240817191051_rename_config_table.up.sql diff --git a/backend/migrations/sqlite/20240820205521_multiple_callback_urls.down.sql b/backend/resources/migrations/sqlite/20240820205521_multiple_callback_urls.down.sql similarity index 100% rename from backend/migrations/sqlite/20240820205521_multiple_callback_urls.down.sql rename to backend/resources/migrations/sqlite/20240820205521_multiple_callback_urls.down.sql diff --git a/backend/migrations/sqlite/20240820205521_multiple_callback_urls.up.sql b/backend/resources/migrations/sqlite/20240820205521_multiple_callback_urls.up.sql similarity index 100% rename from backend/migrations/sqlite/20240820205521_multiple_callback_urls.up.sql rename to backend/resources/migrations/sqlite/20240820205521_multiple_callback_urls.up.sql diff --git a/backend/migrations/sqlite/20240908123031_audit_log.down.sql b/backend/resources/migrations/sqlite/20240908123031_audit_log.down.sql similarity index 100% rename from backend/migrations/sqlite/20240908123031_audit_log.down.sql rename to backend/resources/migrations/sqlite/20240908123031_audit_log.down.sql diff --git a/backend/migrations/sqlite/20240908123031_audit_log.up.sql b/backend/resources/migrations/sqlite/20240908123031_audit_log.up.sql similarity index 100% rename from backend/migrations/sqlite/20240908123031_audit_log.up.sql rename to backend/resources/migrations/sqlite/20240908123031_audit_log.up.sql diff --git a/backend/migrations/sqlite/20240924202721_user_groups.down.sql b/backend/resources/migrations/sqlite/20240924202721_user_groups.down.sql similarity index 100% rename from backend/migrations/sqlite/20240924202721_user_groups.down.sql rename to backend/resources/migrations/sqlite/20240924202721_user_groups.down.sql diff --git a/backend/migrations/sqlite/20240924202721_user_groups.up.sql b/backend/resources/migrations/sqlite/20240924202721_user_groups.up.sql similarity index 100% rename from backend/migrations/sqlite/20240924202721_user_groups.up.sql rename to backend/resources/migrations/sqlite/20240924202721_user_groups.up.sql diff --git a/backend/migrations/sqlite/20241004092030_audit_log_location.down.sql b/backend/resources/migrations/sqlite/20241004092030_audit_log_location.down.sql similarity index 100% rename from backend/migrations/sqlite/20241004092030_audit_log_location.down.sql rename to backend/resources/migrations/sqlite/20241004092030_audit_log_location.down.sql diff --git a/backend/migrations/sqlite/20241004092030_audit_log_location.up.sql b/backend/resources/migrations/sqlite/20241004092030_audit_log_location.up.sql similarity index 100% rename from backend/migrations/sqlite/20241004092030_audit_log_location.up.sql rename to backend/resources/migrations/sqlite/20241004092030_audit_log_location.up.sql diff --git a/backend/migrations/sqlite/20241023072742_unix-timestamps.down.sql b/backend/resources/migrations/sqlite/20241023072742_unix-timestamps.down.sql similarity index 100% rename from backend/migrations/sqlite/20241023072742_unix-timestamps.down.sql rename to backend/resources/migrations/sqlite/20241023072742_unix-timestamps.down.sql diff --git a/backend/migrations/sqlite/20241023072742_unix-timestamps.up.sql b/backend/resources/migrations/sqlite/20241023072742_unix-timestamps.up.sql similarity index 100% rename from backend/migrations/sqlite/20241023072742_unix-timestamps.up.sql rename to backend/resources/migrations/sqlite/20241023072742_unix-timestamps.up.sql diff --git a/backend/migrations/sqlite/20241025214824_app_config_default_value.down.sql b/backend/resources/migrations/sqlite/20241025214824_app_config_default_value.down.sql similarity index 100% rename from backend/migrations/sqlite/20241025214824_app_config_default_value.down.sql rename to backend/resources/migrations/sqlite/20241025214824_app_config_default_value.down.sql diff --git a/backend/migrations/sqlite/20241025214824_app_config_default_value.up.sql b/backend/resources/migrations/sqlite/20241025214824_app_config_default_value.up.sql similarity index 100% rename from backend/migrations/sqlite/20241025214824_app_config_default_value.up.sql rename to backend/resources/migrations/sqlite/20241025214824_app_config_default_value.up.sql diff --git a/backend/migrations/sqlite/20241028064959_custom_claims.down.sql b/backend/resources/migrations/sqlite/20241028064959_custom_claims.down.sql similarity index 100% rename from backend/migrations/sqlite/20241028064959_custom_claims.down.sql rename to backend/resources/migrations/sqlite/20241028064959_custom_claims.down.sql diff --git a/backend/migrations/sqlite/20241028064959_custom_claims.up.sql b/backend/resources/migrations/sqlite/20241028064959_custom_claims.up.sql similarity index 100% rename from backend/migrations/sqlite/20241028064959_custom_claims.up.sql rename to backend/resources/migrations/sqlite/20241028064959_custom_claims.up.sql diff --git a/backend/migrations/sqlite/20241115131129_pkce.down.sql b/backend/resources/migrations/sqlite/20241115131129_pkce.down.sql similarity index 100% rename from backend/migrations/sqlite/20241115131129_pkce.down.sql rename to backend/resources/migrations/sqlite/20241115131129_pkce.down.sql diff --git a/backend/migrations/sqlite/20241115131129_pkce.up.sql b/backend/resources/migrations/sqlite/20241115131129_pkce.up.sql similarity index 100% rename from backend/migrations/sqlite/20241115131129_pkce.up.sql rename to backend/resources/migrations/sqlite/20241115131129_pkce.up.sql