mirror of
https://github.com/muety/wakapi.git
synced 2023-08-10 21:12:56 +03:00
Compare commits
4 Commits
Author | SHA1 | Date | |
---|---|---|---|
e55adf6287 | |||
56800be8e8 | |||
c149766ecc | |||
759e8e4dfd |
@ -172,7 +172,8 @@ You can specify configuration options either via a config file (default: `config
|
|||||||
| `db.user` | `WAKAPI_DB_USER` | - | Database user |
|
| `db.user` | `WAKAPI_DB_USER` | - | Database user |
|
||||||
| `db.password` | `WAKAPI_DB_PASSWORD` | - | Database password |
|
| `db.password` | `WAKAPI_DB_PASSWORD` | - | Database password |
|
||||||
| `db.name` | `WAKAPI_DB_NAME` | `wakapi_db.db` | Database name |
|
| `db.name` | `WAKAPI_DB_NAME` | `wakapi_db.db` | Database name |
|
||||||
| `db.dialect` | `WAKAPI_DB_TYPE` | `sqlite3` | Database type (one of `sqlite3`, `mysql`, `postgres`, `cockroach`) |
|
| `db.dialect` | `WAKAPI_DB_TYPE` | `sqlite3` | Database type (one of `sqlite3`, `mysql`, `postgres`, `cockroach`) |
|
||||||
|
| `db.charset` | `WAKAPI_DB_CHARSET` | `utf8mb4` | Database connection charset (for MySQL only) |
|
||||||
| `db.max_conn` | `WAKAPI_DB_MAX_CONNECTIONS` | `2` | Maximum number of database connections |
|
| `db.max_conn` | `WAKAPI_DB_MAX_CONNECTIONS` | `2` | Maximum number of database connections |
|
||||||
| `db.ssl` | `WAKAPI_DB_SSL` | `false` | Whether to use TLS encryption for database connection (Postgres and CockroachDB only) |
|
| `db.ssl` | `WAKAPI_DB_SSL` | `false` | Whether to use TLS encryption for database connection (Postgres and CockroachDB only) |
|
||||||
|
|
||||||
|
@ -22,6 +22,7 @@ db:
|
|||||||
password: # leave blank when using sqlite3
|
password: # leave blank when using sqlite3
|
||||||
name: wakapi_db.db # database name for mysql / postgres or file path for sqlite (e.g. /tmp/wakapi.db)
|
name: wakapi_db.db # database name for mysql / postgres or file path for sqlite (e.g. /tmp/wakapi.db)
|
||||||
dialect: sqlite3 # mysql, postgres, sqlite3
|
dialect: sqlite3 # mysql, postgres, sqlite3
|
||||||
|
charset: utf8mb4 # only used for mysql connections
|
||||||
max_conn: 2 # maximum number of concurrent connections to maintain
|
max_conn: 2 # maximum number of concurrent connections to maintain
|
||||||
ssl: false # whether to use tls for db connection (must be true for cockroachdb) (ignored for mysql and sqlite)
|
ssl: false # whether to use tls for db connection (must be true for cockroachdb) (ignored for mysql and sqlite)
|
||||||
|
|
||||||
|
@ -77,6 +77,7 @@ type dbConfig struct {
|
|||||||
Password string `env:"WAKAPI_DB_PASSWORD"`
|
Password string `env:"WAKAPI_DB_PASSWORD"`
|
||||||
Name string `default:"wakapi_db.db" env:"WAKAPI_DB_NAME"`
|
Name string `default:"wakapi_db.db" env:"WAKAPI_DB_NAME"`
|
||||||
Dialect string `yaml:"-"`
|
Dialect string `yaml:"-"`
|
||||||
|
Charset string `default:"utf8mb4" env:"WAKAPI_DB_CHARSET"`
|
||||||
Type string `yaml:"dialect" default:"sqlite3" env:"WAKAPI_DB_TYPE"`
|
Type string `yaml:"dialect" default:"sqlite3" env:"WAKAPI_DB_TYPE"`
|
||||||
MaxConn uint `yaml:"max_conn" default:"2" env:"WAKAPI_DB_MAX_CONNECTIONS"`
|
MaxConn uint `yaml:"max_conn" default:"2" env:"WAKAPI_DB_MAX_CONNECTIONS"`
|
||||||
Ssl bool `default:"false" env:"WAKAPI_DB_SSL"`
|
Ssl bool `default:"false" env:"WAKAPI_DB_SSL"`
|
||||||
@ -181,12 +182,13 @@ func (c *dbConfig) GetDialector() gorm.Dialector {
|
|||||||
|
|
||||||
func mysqlConnectionString(config *dbConfig) string {
|
func mysqlConnectionString(config *dbConfig) string {
|
||||||
//location, _ := time.LoadLocation("Local")
|
//location, _ := time.LoadLocation("Local")
|
||||||
return fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8&parseTime=true&loc=%s&sql_mode=ANSI_QUOTES",
|
return fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=%s&parseTime=true&loc=%s&sql_mode=ANSI_QUOTES",
|
||||||
config.User,
|
config.User,
|
||||||
config.Password,
|
config.Password,
|
||||||
config.Host,
|
config.Host,
|
||||||
config.Port,
|
config.Port,
|
||||||
config.Name,
|
config.Name,
|
||||||
|
config.Charset,
|
||||||
"Local",
|
"Local",
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
5
main.go
5
main.go
@ -171,10 +171,7 @@ func main() {
|
|||||||
|
|
||||||
// Globally used middlewares
|
// Globally used middlewares
|
||||||
recoveryMiddleware := handlers.RecoveryHandler()
|
recoveryMiddleware := handlers.RecoveryHandler()
|
||||||
loggingMiddleware := middlewares.NewLoggingMiddleware(
|
loggingMiddleware := middlewares.NewLoggingMiddleware(logbuch.Info, []string{"/assets"})
|
||||||
log.New(os.Stdout, "", log.LstdFlags),
|
|
||||||
[]string{"/assets"},
|
|
||||||
)
|
|
||||||
|
|
||||||
// Router configs
|
// Router configs
|
||||||
router.Use(loggingMiddleware, recoveryMiddleware)
|
router.Use(loggingMiddleware, recoveryMiddleware)
|
||||||
|
@ -4,23 +4,24 @@ package middlewares
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"io"
|
"io"
|
||||||
"log"
|
|
||||||
"net/http"
|
"net/http"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
type logFunc func(string, ...interface{})
|
||||||
|
|
||||||
type LoggingMiddleware struct {
|
type LoggingMiddleware struct {
|
||||||
handler http.Handler
|
handler http.Handler
|
||||||
output *log.Logger
|
logFunc logFunc
|
||||||
excludePrefixes []string
|
excludePrefixes []string
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewLoggingMiddleware(output *log.Logger, excludePrefixes []string) func(http.Handler) http.Handler {
|
func NewLoggingMiddleware(logFunc logFunc, excludePrefixes []string) func(http.Handler) http.Handler {
|
||||||
return func(h http.Handler) http.Handler {
|
return func(h http.Handler) http.Handler {
|
||||||
return &LoggingMiddleware{
|
return &LoggingMiddleware{
|
||||||
handler: h,
|
handler: h,
|
||||||
output: output,
|
logFunc: logFunc,
|
||||||
excludePrefixes: excludePrefixes,
|
excludePrefixes: excludePrefixes,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -41,9 +42,8 @@ func (lg *LoggingMiddleware) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
lg.output.Printf(
|
lg.logFunc(
|
||||||
"%v status=%d, method=%s, uri=%s, duration=%v, bytes=%d, addr=%s\n",
|
"[request] status=%d, method=%s, uri=%s, duration=%v, bytes=%d, addr=%s",
|
||||||
time.Now().Format(time.RFC3339Nano),
|
|
||||||
ww.Status(),
|
ww.Status(),
|
||||||
r.Method,
|
r.Method,
|
||||||
r.URL.String(),
|
r.URL.String(),
|
||||||
|
@ -37,11 +37,15 @@ func init() {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if cfg.Db.Dialect == config.SQLDialectSqlite {
|
||||||
|
logbuch.Info("not attempting to drop column 'badges_enabled' on sqlite")
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
if err := migrator.DropColumn(&models.User{}, "badges_enabled"); err != nil {
|
if err := migrator.DropColumn(&models.User{}, "badges_enabled"); err != nil {
|
||||||
return err
|
return err
|
||||||
} else {
|
|
||||||
logbuch.Info("dropped column 'badges_enabled' after substituting it by sharing indicators")
|
|
||||||
}
|
}
|
||||||
|
logbuch.Info("dropped column 'badges_enabled' after substituting it by sharing indicators")
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
},
|
},
|
||||||
|
@ -85,7 +85,7 @@ def post_data_sync(data: List[Heartbeat], url: str, api_key: str):
|
|||||||
|
|
||||||
|
|
||||||
def randomword(length: int) -> str:
|
def randomword(length: int) -> str:
|
||||||
letters = string.ascii_lowercase
|
letters = string.ascii_lowercase + 'äöü💩' # test utf8 and utf8mb4 characters as well
|
||||||
return ''.join(random.choice(letters) for _ in range(length))
|
return ''.join(random.choice(letters) for _ in range(length))
|
||||||
|
|
||||||
|
|
||||||
|
@ -1 +1 @@
|
|||||||
1.24.1
|
1.24.4
|
||||||
|
Reference in New Issue
Block a user