feat: site languages, setup and site URL settings

This commit is contained in:
Florian Sylvain committed 2026-11-01 22:13:02 +01:00
1 parent 0806733d5c
commit d9158025d4
106 files changed
+10184 -56

No files matched your search

@@ -23,6 +23,7 @@ type Config struct {
type Driver interface {
Open(source string) (*gorm.DB, error)
NewBackup(db *gorm.DB, directory string, now func() time.Time) domainUpdate.DatabaseBackup
IsLockContention(err error) bool
}
var drivers = map[string]Driver{
@@ -31,6 +32,15 @@ var drivers = map[string]Driver{
DriverPostgres: postgresDriver{},
}
func IsLockContentionFor(driverName string, err error) bool {
driver, ok := drivers[driverName]
return ok && err != nil && driver.IsLockContention(err)
}
func IsLockContention(db *gorm.DB, err error) bool {
return IsLockContentionFor(db.Name(), err)
}
type Connection struct {
DB *gorm.DB
driver Driver
@@ -2,6 +2,7 @@ package database
import (
domainUpdate "RenewCMS/internal/domain/update"
"errors"
"fmt"
"net"
"strings"
@@ -22,6 +23,8 @@ const (
mysqlSessionSQLMode = "'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'"
mysqlTableOptionsKey = "gorm:table_options"
redactedPassword = "***"
mysqlLockNowait = 3572
mysqlLockWaitTimeout = 1205
)
type mysqlDriver struct{}
@@ -84,3 +87,8 @@ func tableOptionsFor(db *gorm.DB) *gorm.DB {
}
return db
}
func (mysqlDriver) IsLockContention(err error) bool {
var failure *mysqldriver.MySQLError
return errors.As(err, &failure) && (failure.Number == mysqlLockNowait || failure.Number == mysqlLockWaitTimeout)
}
@@ -2,6 +2,7 @@ package database
import (
domainUpdate "RenewCMS/internal/domain/update"
"errors"
"fmt"
"net"
"net/url"
@@ -21,6 +22,7 @@ const (
postgresScheme = "postgres"
postgresUTCCallback = "renewcms:postgres_utc"
gormQueryCallback = "gorm:query"
postgresLockNotAvailable = "55P03"
)
var timeType = reflect.TypeOf(time.Time{})
@@ -106,3 +108,8 @@ func convertStructTimesToUTC(value reflect.Value) {
func (postgresDriver) NewBackup(db *gorm.DB, directory string, now func() time.Time) domainUpdate.DatabaseBackup {
return NewPostgresBackup(db, directory, now)
}
func (postgresDriver) IsLockContention(err error) bool {
var failure *pgconn.PgError
return errors.As(err, &failure) && failure.Code == postgresLockNotAvailable
}
@@ -2,6 +2,7 @@ package database
import (
domainUpdate "RenewCMS/internal/domain/update"
"errors"
"fmt"
"os"
"path/filepath"
@@ -13,7 +14,12 @@ import (
const DriverSQLite = "sqlite"
const sqliteBusyTimeoutMs = 5000
const (
sqliteBusyTimeoutMs = 5000
sqliteResultBusy = 5
sqliteResultLocked = 6
sqlitePrimaryMask = 0xff
)
type sqliteDriver struct{}
@@ -31,3 +37,12 @@ func (sqliteDriver) Open(file string) (*gorm.DB, error) {
func (sqliteDriver) NewBackup(db *gorm.DB, directory string, now func() time.Time) domainUpdate.DatabaseBackup {
return NewSQLiteBackup(db, directory, now)
}
func (sqliteDriver) IsLockContention(err error) bool {
var coded interface{ Code() int }
if !errors.As(err, &coded) {
return false
}
primary := coded.Code() & sqlitePrimaryMask
return primary == sqliteResultBusy || primary == sqliteResultLocked
}