diff --git a/web/src/main/kotlin/ru/ysu/lms/web/admin/ContentAdminController.kt b/web/src/main/kotlin/ru/ysu/lms/web/admin/ContentAdminController.kt index 75dd731..a841728 100644 --- a/web/src/main/kotlin/ru/ysu/lms/web/admin/ContentAdminController.kt +++ b/web/src/main/kotlin/ru/ysu/lms/web/admin/ContentAdminController.kt @@ -3,6 +3,7 @@ package ru.ysu.lms.web.admin import jakarta.servlet.http.HttpSession import org.springframework.stereotype.Controller import org.springframework.web.bind.annotation.GetMapping +import org.springframework.web.bind.annotation.ModelAttribute import org.springframework.web.bind.annotation.PathVariable import org.springframework.web.bind.annotation.PostMapping import org.springframework.web.bind.annotation.RequestBody @@ -91,19 +92,17 @@ class ContentAdminController( @PostMapping("/{kind}/toggle-published") fun togglePublished( @PathVariable kind: String, - @RequestParam id: String, - @RequestParam published: Boolean, - @RequestParam(required = false) back: String?, + @ModelAttribute form: TogglePublishedForm, session: HttpSession, redirect: RedirectAttributes, ): String = try { - api.setContentPublished(token(session), kind, id, published) + api.setContentPublished(token(session), kind, form.id, form.published) redirect.addFlashAttribute( "notice", - if (published) "Материал опубликован — теперь его видят студенты" else "Материал скрыт от студентов", + if (form.published) "Материал опубликован — теперь его видят студенты" else "Материал скрыт от студентов", ) - redirectBack(back, "redirect:/learn") + redirectBack(form.back, "redirect:/learn") } catch (ex: ApiException) { redirect.addFlashAttribute("error", ex.message) "redirect:/learn" @@ -112,16 +111,14 @@ class ContentAdminController( @PostMapping("/articles/{id}/save") fun save( @PathVariable id: String, - @RequestParam title: String, - @RequestParam bodyMd: String, - @RequestParam(required = false) back: String?, + @ModelAttribute form: ArticleSaveForm, session: HttpSession, redirect: RedirectAttributes, ): String = try { - api.updateContentArticle(token(session), id, title, bodyMd) + api.updateContentArticle(token(session), id, form.title, form.bodyMd) redirect.addFlashAttribute("notice", "Статья сохранена") - redirectBack(back, "redirect:/admin/content") + redirectBack(form.back, "redirect:/admin/content") } catch (ex: ApiException) { redirect.addFlashAttribute("error", ex.message) "redirect:/admin/content/articles/$id/edit" @@ -195,17 +192,14 @@ class ContentAdminController( @PostMapping("/sections/create") fun createSection( - @RequestParam chapterId: String, - @RequestParam title: String, - @RequestParam(required = false) slug: String?, - @RequestParam(required = false) back: String?, + @ModelAttribute form: SectionCreateForm, session: HttpSession, redirect: RedirectAttributes, ): String = try { - api.createSection(token(session), chapterId, title.trim(), slug) - redirect.addFlashAttribute("notice", "Раздел «${title.trim()}» создан") - redirectBack(back, "redirect:/admin/content") + api.createSection(token(session), form.chapterId, form.title.trim(), form.slug) + redirect.addFlashAttribute("notice", "Раздел «${form.title.trim()}» создан") + redirectBack(form.back, "redirect:/admin/content") } catch (ex: ApiException) { redirect.addFlashAttribute("error", ex.message) "redirect:/admin/content" @@ -252,28 +246,22 @@ class ContentAdminController( @PostMapping("/articles/create") fun createArticle( - @RequestParam(required = false) chapterId: String?, - @RequestParam(required = false) sectionId: String?, - @RequestParam(required = false) newChapterTitle: String?, - @RequestParam(required = false) newSectionTitle: String?, - @RequestParam title: String, - @RequestParam(required = false, defaultValue = "") bodyMd: String, - @RequestParam(required = false) back: String?, + @ModelAttribute form: ArticleCreateForm, session: HttpSession, redirect: RedirectAttributes, ): String = try { api.createArticle( token(session), - chapterId, - sectionId, - newChapterTitle?.takeIf { it.isNotBlank() }, - newSectionTitle?.takeIf { it.isNotBlank() }, - title.trim(), - bodyMd, + form.chapterId, + form.sectionId, + form.newChapterTitle?.takeIf { it.isNotBlank() }, + form.newSectionTitle?.takeIf { it.isNotBlank() }, + form.title.trim(), + form.bodyMd, ) - redirect.addFlashAttribute("notice", "Статья «${title.trim()}» создана") - redirectBack(back, "redirect:/admin/content") + redirect.addFlashAttribute("notice", "Статья «${form.title.trim()}» создана") + redirectBack(form.back, "redirect:/admin/content") } catch (ex: ApiException) { redirect.addFlashAttribute("error", ex.message) "redirect:/admin/content" diff --git a/web/src/main/kotlin/ru/ysu/lms/web/admin/ContentAdminForms.kt b/web/src/main/kotlin/ru/ysu/lms/web/admin/ContentAdminForms.kt new file mode 100644 index 0000000..85e9dcb --- /dev/null +++ b/web/src/main/kotlin/ru/ysu/lms/web/admin/ContentAdminForms.kt @@ -0,0 +1,31 @@ +package ru.ysu.lms.web.admin + +/** Формы админки материалов: связываются через @ModelAttribute, имена полей = имена в шаблонах. */ +data class TogglePublishedForm( + val id: String = "", + val published: Boolean = false, + val back: String? = null, +) + +data class ArticleSaveForm( + val title: String = "", + val bodyMd: String = "", + val back: String? = null, +) + +data class SectionCreateForm( + val chapterId: String = "", + val title: String = "", + val slug: String? = null, + val back: String? = null, +) + +data class ArticleCreateForm( + val chapterId: String? = null, + val sectionId: String? = null, + val newChapterTitle: String? = null, + val newSectionTitle: String? = null, + val title: String = "", + val bodyMd: String = "", + val back: String? = null, +)