re-enabled autoseeding of attachment groups
All checks were successful
CI/CD Pipeline / test (push) Successful in 7s
CI/CD Pipeline / deploy (push) Successful in 19s

This commit is contained in:
2026-01-28 20:01:02 +01:00
parent c33cde6f04
commit 7fbc566129
2 changed files with 63 additions and 12 deletions

View File

@@ -1140,34 +1140,63 @@ export default function Acp({ isAdmin }) {
setAttachmentGroupsError('') setAttachmentGroupsError('')
setAttachmentExtensionsError('') setAttachmentExtensionsError('')
try { try {
const groupsByName = new Map(attachmentGroups.map((group) => [group.name, group]))
const extensionsByGroup = new Map()
attachmentExtensions.forEach((ext) => {
const groupId = ext.attachment_group_id ? String(ext.attachment_group_id) : 'none'
if (!extensionsByGroup.has(groupId)) {
extensionsByGroup.set(groupId, new Set())
}
extensionsByGroup
.get(groupId)
.add(String(ext.extension || '').toLowerCase())
})
const createdGroups = [] const createdGroups = []
const createdExtensions = [] const createdExtensions = []
for (const group of attachmentDefaultSeed) { for (const group of attachmentDefaultSeed) {
const parent = await createAttachmentGroup({ let parent = groupsByName.get(group.name)
name: group.name, if (!parent) {
max_size_kb: group.max_size_kb, parent = await createAttachmentGroup({
is_active: true, name: group.name,
}) max_size_kb: group.max_size_kb,
is_active: true,
})
groupsByName.set(group.name, parent)
createdGroups.push(parent)
}
createdGroups.push(parent) createdGroups.push(parent)
for (const child of group.children || []) { for (const child of group.children || []) {
const createdChild = await createAttachmentGroup({ let createdChild = groupsByName.get(child.name)
name: child.name, if (!createdChild) {
parent_id: parent.id, createdChild = await createAttachmentGroup({
max_size_kb: child.max_size_kb, name: child.name,
is_active: true, parent_id: parent.id,
}) max_size_kb: child.max_size_kb,
createdGroups.push(createdChild) is_active: true,
})
groupsByName.set(child.name, createdChild)
createdGroups.push(createdChild)
}
const groupKey = String(createdChild.id)
const existingSet = extensionsByGroup.get(groupKey) || new Set()
for (const ext of child.extensions || []) { for (const ext of child.extensions || []) {
const key = String(ext.ext || '').toLowerCase()
if (existingSet.has(key)) {
continue
}
const createdExt = await createAttachmentExtension({ const createdExt = await createAttachmentExtension({
extension: ext.ext, extension: ext.ext,
attachment_group_id: createdChild.id, attachment_group_id: createdChild.id,
allowed_mimes: ext.mimes, allowed_mimes: ext.mimes,
}) })
createdExtensions.push(createdExt) createdExtensions.push(createdExt)
existingSet.add(key)
} }
extensionsByGroup.set(groupKey, existingSet)
} }
} }
@@ -2677,6 +2706,16 @@ export default function Acp({ isAdmin }) {
<div className="d-flex justify-content-between align-items-center mb-3"> <div className="d-flex justify-content-between align-items-center mb-3">
<h5 className="mb-0">{t('attachment.groups_title')}</h5> <h5 className="mb-0">{t('attachment.groups_title')}</h5>
<div className="d-flex align-items-center gap-2"> <div className="d-flex align-items-center gap-2">
<Button
type="button"
className="bb-accent-button"
onClick={handleSeedAttachmentDefaults}
disabled={attachmentSeedSaving}
>
{attachmentSeedSaving
? t('attachment.seed_in_progress')
: t('attachment.seed_defaults')}
</Button>
<Button <Button
type="button" type="button"
variant="outline-secondary" variant="outline-secondary"
@@ -2722,6 +2761,16 @@ export default function Acp({ isAdmin }) {
{!attachmentGroupsLoading && attachmentGroups.length > 0 {!attachmentGroupsLoading && attachmentGroups.length > 0
&& attachmentGroups.every((group) => !group.parent_id) && ( && attachmentGroups.every((group) => !group.parent_id) && (
<div className="bb-muted mb-3"> <div className="bb-muted mb-3">
<Button
type="button"
className="bb-accent-button me-2"
onClick={handleSeedAttachmentDefaults}
disabled={attachmentSeedSaving}
>
{attachmentSeedSaving
? t('attachment.seed_in_progress')
: t('attachment.seed_defaults')}
</Button>
<Button <Button
type="button" type="button"
variant="outline-secondary" variant="outline-secondary"

View File

@@ -9,6 +9,7 @@ use App\Http\Controllers\I18nController;
use App\Http\Controllers\PortalController; use App\Http\Controllers\PortalController;
use App\Http\Controllers\PostController; use App\Http\Controllers\PostController;
use App\Http\Controllers\PostThankController; use App\Http\Controllers\PostThankController;
use App\Http\Controllers\PreviewController;
use App\Http\Controllers\SettingController; use App\Http\Controllers\SettingController;
use App\Http\Controllers\StatsController; use App\Http\Controllers\StatsController;
use App\Http\Controllers\ThreadController; use App\Http\Controllers\ThreadController;
@@ -96,3 +97,4 @@ Route::post('/posts', [PostController::class, 'store'])->middleware('auth:sanctu
Route::post('/posts/{post}/thanks', [PostThankController::class, 'store'])->middleware('auth:sanctum'); Route::post('/posts/{post}/thanks', [PostThankController::class, 'store'])->middleware('auth:sanctum');
Route::delete('/posts/{post}/thanks', [PostThankController::class, 'destroy'])->middleware('auth:sanctum'); Route::delete('/posts/{post}/thanks', [PostThankController::class, 'destroy'])->middleware('auth:sanctum');
Route::delete('/posts/{post}', [PostController::class, 'destroy'])->middleware('auth:sanctum'); Route::delete('/posts/{post}', [PostController::class, 'destroy'])->middleware('auth:sanctum');
Route::post('/preview', [PreviewController::class, 'preview'])->middleware('auth:sanctum');