feat(admin): online dictionary update — upload archive, preview word diff, install & activate
CI / changes (pull_request) Successful in 2s
CI / unit (pull_request) Successful in 23s
CI / integration (pull_request) Successful in 18s
CI / ui (pull_request) Successful in 45s
CI / gate (pull_request) Successful in 0s
CI / deploy (pull_request) Successful in 1m5s
CI / changes (pull_request) Successful in 2s
CI / unit (pull_request) Successful in 23s
CI / integration (pull_request) Successful in 18s
CI / ui (pull_request) Successful in 45s
CI / gate (pull_request) Successful in 0s
CI / deploy (pull_request) Successful in 1m5s
Replace the dictionary hot-reload with an online update flow in the GM console (/_gm/dictionary): the operator uploads scrabble-dawg-vX.Y.Z.tar.gz, previews the per-variant words added/removed against the active dictionary, and confirms to install + activate it. Versions are immutable; in-progress games keep their pinned version while new games use the new one. - engine: DiffWords (enumerate both DAWGs, decode only the differences), OpenFinder, Registry.Finder, DictFiles; OpenWithVersions skips the .staging area. - dictadmin: hardened release-archive validation + extraction (path-traversal, symlink, oversize, entry-count rejection) and staging -> install (atomic rename). - game: active dictionary version persisted in the dictionary_state singleton (single source of truth, restored on boot), concurrency-safe accessor. - storage: BACKEND_DICT_DIR is a named volume seeded from the image (nonroot-owned), so uploaded versions persist across redeploys; the build's DICT_VERSION labels the seed and equals the resident tag (BACKEND_DICT_VERSION). - docs: ARCHITECTURE §5, FUNCTIONAL (+ru), backend README, TESTING, PRERELEASE. Tests: engine + dictadmin unit; integration upload->preview->install->activate-> restart->pin->immutability->CSRF.
This commit is contained in:
@@ -43,7 +43,10 @@ type DashboardView struct {
|
||||
ActiveGames int
|
||||
OpenComplaints int
|
||||
PendingChanges int
|
||||
Variants []VariantVersions
|
||||
// ActiveVersion is the dictionary version new games pin (the persisted active
|
||||
// version), distinct from the per-variant resident versions.
|
||||
ActiveVersion string
|
||||
Variants []VariantVersions
|
||||
}
|
||||
|
||||
// UsersView is the paginated account list.
|
||||
@@ -237,11 +240,13 @@ type ComplaintDetailView struct {
|
||||
Resolved bool
|
||||
}
|
||||
|
||||
// DictionaryView lists the resident versions per variant and the pending
|
||||
// wordlist changes from accepted complaints.
|
||||
// DictionaryView lists the resident versions per variant, the active version new
|
||||
// games pin, and the pending wordlist changes from accepted complaints.
|
||||
type DictionaryView struct {
|
||||
Variants []VariantVersions
|
||||
Changes []DictChangeRow
|
||||
// ActiveVersion is the dictionary version new games pin; the update form sets it.
|
||||
ActiveVersion string
|
||||
Variants []VariantVersions
|
||||
Changes []DictChangeRow
|
||||
}
|
||||
|
||||
// DictChangeRow is one pending wordlist edit.
|
||||
@@ -252,6 +257,32 @@ type DictChangeRow struct {
|
||||
ResolvedAt string
|
||||
}
|
||||
|
||||
// DictionaryPreviewView is the second step of a dictionary update: the version
|
||||
// parsed from the uploaded archive (editable before confirming), the staging token
|
||||
// that names the uploaded files on disk, the active version the diff is against, and
|
||||
// the per-variant word diff.
|
||||
type DictionaryPreviewView struct {
|
||||
Version string
|
||||
Token string
|
||||
ActiveVersion string
|
||||
Variants []VariantDiffRow
|
||||
}
|
||||
|
||||
// VariantDiffRow summarises one variant's word diff in the update preview.
|
||||
// AddedCount/RemovedCount are the full totals; AddedSample/RemovedSample are the
|
||||
// first words shown (capped); AddedTruncated/RemovedTruncated mark a capped list;
|
||||
// LargeRemoval flags a removal large enough to warrant caution before confirming.
|
||||
type VariantDiffRow struct {
|
||||
Variant string
|
||||
AddedCount int
|
||||
RemovedCount int
|
||||
AddedSample []string
|
||||
RemovedSample []string
|
||||
AddedTruncated bool
|
||||
RemovedTruncated bool
|
||||
LargeRemoval bool
|
||||
}
|
||||
|
||||
// BroadcastView is the operator-broadcast form page.
|
||||
type BroadcastView struct {
|
||||
ConnectorEnabled bool
|
||||
|
||||
Reference in New Issue
Block a user