Seed the AppModel settings row and expose language/workspace options
Upstream's own web installer inserts the single-row AppModel settings table that the admin Environment tab (Language/Timezone/SMTP) reads and writes via app()/AppModel::updateSet(). hortusfox-setup bypasses that installer and never created this row, so AppModel::updateSet()'s WHERE-less UPDATE matched zero rows: every admin "Save" reported success but changed nothing, and app_mail_config() was nulling out $_ENV['SMTP_*'] on every request from the same missing row, silently breaking outbound mail. Seed the row on first boot, and add language/workspace options (alongside the existing timezone) so APP_LANG/APP_WORKSPACE and the seeded row both follow them.
This commit is contained in:
@@ -91,8 +91,8 @@ let
|
|||||||
APP_CONTACT = "dbrendel1988@gmail.com";
|
APP_CONTACT = "dbrendel1988@gmail.com";
|
||||||
APP_DEBUG = false;
|
APP_DEBUG = false;
|
||||||
APP_BASEDIR = "";
|
APP_BASEDIR = "";
|
||||||
APP_LANG = "en";
|
APP_LANG = cfg.language;
|
||||||
APP_WORKSPACE = "My workspace";
|
APP_WORKSPACE = cfg.workspace;
|
||||||
APP_OVERDUETASK_HOURS = 10;
|
APP_OVERDUETASK_HOURS = 10;
|
||||||
APP_CRONJOB_MAILLIMIT = 5;
|
APP_CRONJOB_MAILLIMIT = 5;
|
||||||
APP_GITHUB_URL = "https://github.com/danielbrendel/hortusfox-web";
|
APP_GITHUB_URL = "https://github.com/danielbrendel/hortusfox-web";
|
||||||
@@ -256,6 +256,23 @@ in {
|
|||||||
|
|
||||||
timezone = lib.mkOption { type = lib.types.str; default = "UTC"; };
|
timezone = lib.mkOption { type = lib.types.str; default = "UTC"; };
|
||||||
|
|
||||||
|
language = lib.mkOption {
|
||||||
|
type = lib.types.str;
|
||||||
|
default = "en";
|
||||||
|
example = "de";
|
||||||
|
description = ''
|
||||||
|
UI language (APP_LANG). Must match one of the language codes
|
||||||
|
upstream ships translation files for under lang/.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
workspace = lib.mkOption {
|
||||||
|
type = lib.types.str;
|
||||||
|
default = "My workspace";
|
||||||
|
example = "Greenhouse";
|
||||||
|
description = "Workspace name shown in the UI (APP_WORKSPACE).";
|
||||||
|
};
|
||||||
|
|
||||||
database.name = lib.mkOption { type = lib.types.str; default = "hortusfox"; };
|
database.name = lib.mkOption { type = lib.types.str; default = "hortusfox"; };
|
||||||
|
|
||||||
secretFile = lib.mkOption {
|
secretFile = lib.mkOption {
|
||||||
@@ -492,7 +509,38 @@ in {
|
|||||||
if [ ! -e "${stateDir}/.installed" ]; then
|
if [ ! -e "${stateDir}/.installed" ]; then
|
||||||
php asatru migrate:fresh
|
php asatru migrate:fresh
|
||||||
|
|
||||||
# 5. Seed the initial admin account. migrate:fresh creates no
|
# 5. Seed the AppModel settings row. migrate:fresh only creates
|
||||||
|
# the (empty) table -- upstream's own web installer is what
|
||||||
|
# inserts the single settings row that app()/AppModel's own
|
||||||
|
# admin-panel features (the Environment tab's Language/
|
||||||
|
# Timezone fields, SMTP toggle, etc.) read and write, and we
|
||||||
|
# bypass that installer entirely. Without this row,
|
||||||
|
# AppModel::updateSet()'s `UPDATE AppModel SET ...` -- no
|
||||||
|
# WHERE clause, since it's a de-facto single-row table --
|
||||||
|
# matches zero rows, so every "Save" in the admin Environment
|
||||||
|
# tab reports success but silently changes nothing. This
|
||||||
|
# includes Language/Timezone: those live here, not in .env
|
||||||
|
# (.env's APP_LANG is only a fallback used when this row is
|
||||||
|
# missing, and APP_TIMEZONE only sets PHP's global default
|
||||||
|
# timezone -- see AppHelper.php/bootstrap.php upstream,
|
||||||
|
# neither is what the admin UI's fields actually edit). It
|
||||||
|
# also means app_mail_config() -- called at the top of every
|
||||||
|
# single request/cronjob -- was overwriting $_ENV['SMTP_*']
|
||||||
|
# with NULLs read from this nonexistent row on every request,
|
||||||
|
# silently breaking outbound mail regardless of smtp.*/
|
||||||
|
# secretFile; seeding smtp_* here fixes that too. smtp_password
|
||||||
|
# is deliberately left NULL: it's secret-only (see
|
||||||
|
# secretFile), not a plain Nix option, and leaving it NULL is
|
||||||
|
# no regression versus the previous (rowless) behavior either
|
||||||
|
# way. cronjob_pw is generated the same way AppModel's own
|
||||||
|
# generateCronjobToken() does. Every other column either has
|
||||||
|
# no corresponding Nix option yet or just mirrors the
|
||||||
|
# migration's own column default, same as upstream's
|
||||||
|
# installer does.
|
||||||
|
cronjob_pw="$(php -r 'echo md5(random_bytes(55) . date("Y-m-d H:i:s"));')"
|
||||||
|
mariadb "${cfg.database.name}" -e "INSERT INTO AppModel (id, workspace, language, timezone, scroller, chat_enable, chat_timelimit, chat_showusers, chat_indicator, chat_system, history_enable, history_name, enable_media_share, cronjob_pw, overlay_alpha, smtp_enable_auth, smtp_fromname, smtp_fromaddress, smtp_host, smtp_port, smtp_username, smtp_password, smtp_encryption, pwa_enable, owm_enable, owm_api_key, owm_latitude, owm_longitude, owm_unittype, owm_cache) VALUES (NULL, '${sqlEscape envVars.APP_WORKSPACE}', '${sqlEscape cfg.language}', '${sqlEscape cfg.timezone}', 1, 1, 5, 1, 1, 1, 1, 'History', 0, '$cronjob_pw', NULL, 1, '${sqlEscape cfg.smtp.fromName}', '${sqlEscape cfg.smtp.fromAddress}', '${sqlEscape cfg.smtp.host}', ${toString cfg.smtp.port}, '${sqlEscape cfg.smtp.username}', NULL, '${sqlEscape cfg.smtp.encryption}', 0, 0, NULL, NULL, NULL, 'default', 300);"
|
||||||
|
|
||||||
|
# 6. Seed the initial admin account. migrate:fresh creates no
|
||||||
# user rows at all, and the app's only "create user" flow
|
# user rows at all, and the app's only "create user" flow
|
||||||
# lives behind the admin panel -- without this, a fresh
|
# lives behind the admin panel -- without this, a fresh
|
||||||
# deployment has no way to log in, ever. Insert directly
|
# deployment has no way to log in, ever. Insert directly
|
||||||
|
|||||||
Reference in New Issue
Block a user