@@ -9,6 +9,7 @@ import codel.admin.presentation.request.AdminLoginRequest
99import codel.admin.presentation.request.RejectProfileRequest
1010import codel.member.domain.Member
1111import codel.question.domain.QuestionCategory
12+ import codel.question.domain.QuestionGroup
1213import jakarta.servlet.http.Cookie
1314import jakarta.servlet.http.HttpServletResponse
1415import org.springframework.data.domain.Page
@@ -321,8 +322,8 @@ class AdminController(
321322 " DONE" to adminService.countMembersByStatus(" DONE" ),
322323 " REJECT" to adminService.countMembersByStatus(" REJECT" ),
323324 " PHONE_VERIFIED" to adminService.countMembersByStatus(" PHONE_VERIFIED" ),
324- " WITHDRAWN " to adminService.countMembersByStatus(" WITHDRAWN " ),
325- " PERSONALITY_COMPLETED " to adminService.countMembersByStatus(" PERSONALITY_COMPLETED " )
325+ " PERSONALITY_COMPLETED " to adminService.countMembersByStatus(" PERSONALITY_COMPLETED " ),
326+ " WITHDRAWN " to adminService.countMembersByStatus(" WITHDRAWN " )
326327 )
327328
328329 model.addAttribute(" members" , members)
@@ -360,36 +361,51 @@ class AdminController(
360361 fun questionList (
361362 model : Model ,
362363 @RequestParam(required = false ) keyword : String? ,
364+ @RequestParam(required = false ) purpose : String? ,
363365 @RequestParam(required = false ) category : String? ,
366+ @RequestParam(required = false ) questionGroup : String? ,
364367 @RequestParam(required = false ) isActive : Boolean? ,
365368 @PageableDefault(size = 20 ) pageable : Pageable
366369 ): String {
367- val questions = adminService.findQuestionsWithFilter (keyword, category, isActive, pageable)
370+ val questions = adminService.findQuestionsWithFilterV2 (keyword, category, questionGroup , isActive, pageable)
368371 model.addAttribute(" questions" , questions)
369372 model.addAttribute(" categories" , QuestionCategory .values())
370- model.addAttribute(" selectedKeyword" , keyword ? : " " )
371- model.addAttribute(" selectedCategory" , category ? : " " )
372- model.addAttribute(" selectedIsActive" , isActive?.toString() ? : " " )
373+ model.addAttribute(" questionGroups" , QuestionGroup .values())
374+ model.addAttribute(" searchParams" , mapOf (
375+ " keyword" to (keyword ? : " " ),
376+ " purpose" to (purpose ? : " " ),
377+ " category" to (category ? : " " ),
378+ " questionGroup" to (questionGroup ? : " " ),
379+ " isActive" to (isActive?.toString() ? : " " )
380+ ))
373381 return " questionList"
374382 }
375383
376384 @GetMapping(" /v1/admin/questions/new" )
377385 fun questionForm (model : Model ): String {
378386 model.addAttribute(" categories" , QuestionCategory .values())
387+ model.addAttribute(" questionGroups" , QuestionGroup .values())
379388 return " questionForm"
380389 }
381390
382391 @PostMapping(" /v1/admin/questions" )
383392 fun createQuestion (
384393 @RequestParam content : String ,
385394 @RequestParam category : String ,
395+ @RequestParam(required = false ) questionGroup : String? ,
386396 @RequestParam(required = false ) description : String? ,
387397 @RequestParam(defaultValue = " true" ) isActive : Boolean ,
388398 redirectAttributes : RedirectAttributes
389399 ): String {
390400 try {
391401 val questionCategory = QuestionCategory .valueOf(category)
392- adminService.createQuestion(content, questionCategory, description, isActive)
402+ // 회원가입 전용 카테고리(채팅 미사용)는 자동으로 RANDOM 그룹 지정
403+ val group = if (questionCategory.usedInSignup && ! questionCategory.usedInChat) {
404+ QuestionGroup .RANDOM
405+ } else {
406+ QuestionGroup .valueOf(questionGroup ? : " RANDOM" )
407+ }
408+ adminService.createQuestionV2(content, questionCategory, group, description, isActive)
393409 redirectAttributes.addFlashAttribute(" success" , " 질문이 성공적으로 등록되었습니다." )
394410 } catch (e: Exception ) {
395411 redirectAttributes.addFlashAttribute(" error" , " 질문 등록에 실패했습니다: ${e.message} " )
@@ -400,21 +416,12 @@ class AdminController(
400416 @GetMapping(" /v1/admin/questions/{questionId}/edit" )
401417 fun editQuestionForm (
402418 @PathVariable questionId : Long ,
403- @RequestParam(required = false ) keyword : String? ,
404- @RequestParam(required = false ) category : String? ,
405- @RequestParam(required = false ) isActive : String? ,
406- @RequestParam(required = false , defaultValue = " 0" ) page : Int ,
407- @RequestParam(required = false , defaultValue = " 20" ) size : Int ,
408419 model : Model
409420 ): String {
410421 val question = adminService.findQuestionById(questionId)
411422 model.addAttribute(" question" , question)
412423 model.addAttribute(" categories" , QuestionCategory .values())
413- model.addAttribute(" filterKeyword" , keyword)
414- model.addAttribute(" filterCategory" , category)
415- model.addAttribute(" filterIsActive" , isActive)
416- model.addAttribute(" filterPage" , page)
417- model.addAttribute(" filterSize" , size)
424+ model.addAttribute(" questionGroups" , QuestionGroup .values())
418425 return " questionEditForm"
419426 }
420427
@@ -423,43 +430,30 @@ class AdminController(
423430 @PathVariable questionId : Long ,
424431 @RequestParam content : String ,
425432 @RequestParam category : String ,
433+ @RequestParam(required = false ) questionGroup : String? ,
426434 @RequestParam(required = false ) description : String? ,
427435 @RequestParam(defaultValue = " false" ) isActive : Boolean ,
428- @RequestParam(required = false ) keyword : String? ,
429- @RequestParam(required = false ) filterCategory : String? ,
430- @RequestParam(required = false ) filterIsActive : String? ,
431- @RequestParam(required = false , defaultValue = " 0" ) page : Int ,
432- @RequestParam(required = false , defaultValue = " 20" ) size : Int ,
433436 redirectAttributes : RedirectAttributes
434437 ): String {
435438 try {
436439 val questionCategory = QuestionCategory .valueOf(category)
437- adminService.updateQuestion(questionId, content, questionCategory, description, isActive)
440+ // 회원가입 전용 카테고리(채팅 미사용)는 자동으로 RANDOM 그룹 지정
441+ val group = if (questionCategory.usedInSignup && ! questionCategory.usedInChat) {
442+ QuestionGroup .RANDOM
443+ } else {
444+ QuestionGroup .valueOf(questionGroup ? : " RANDOM" )
445+ }
446+ adminService.updateQuestionV2(questionId, content, questionCategory, group, description, isActive)
438447 redirectAttributes.addFlashAttribute(" success" , " 질문이 성공적으로 수정되었습니다." )
439448 } catch (e: Exception ) {
440449 redirectAttributes.addFlashAttribute(" error" , " 질문 수정에 실패했습니다: ${e.message} " )
441450 }
442-
443- // 필터 조건 유지하여 리다이렉트
444- val params = mutableListOf<String >()
445- keyword?.let { if (it.isNotBlank()) params.add(" keyword=$it " ) }
446- filterCategory?.let { if (it.isNotBlank()) params.add(" category=$it " ) }
447- filterIsActive?.let { if (it.isNotBlank()) params.add(" isActive=$it " ) }
448- params.add(" page=$page " )
449- params.add(" size=$size " )
450-
451- val queryString = if (params.isNotEmpty()) " ?${params.joinToString(" &" )} " else " "
452- return " redirect:/v1/admin/questions$queryString "
451+ return " redirect:/v1/admin/questions"
453452 }
454453
455454 @PostMapping(" /v1/admin/questions/{questionId}/delete" )
456455 fun deleteQuestion (
457456 @PathVariable questionId : Long ,
458- @RequestParam(required = false ) keyword : String? ,
459- @RequestParam(required = false ) category : String? ,
460- @RequestParam(required = false ) isActive : String? ,
461- @RequestParam(required = false , defaultValue = " 0" ) page : Int ,
462- @RequestParam(required = false , defaultValue = " 20" ) size : Int ,
463457 redirectAttributes : RedirectAttributes
464458 ): String {
465459 try {
@@ -468,27 +462,12 @@ class AdminController(
468462 } catch (e: Exception ) {
469463 redirectAttributes.addFlashAttribute(" error" , " 질문 삭제에 실패했습니다: ${e.message} " )
470464 }
471-
472- // 필터 조건 유지하여 리다이렉트
473- val params = mutableListOf<String >()
474- keyword?.let { if (it.isNotBlank()) params.add(" keyword=$it " ) }
475- category?.let { if (it.isNotBlank()) params.add(" category=$it " ) }
476- isActive?.let { if (it.isNotBlank()) params.add(" isActive=$it " ) }
477- params.add(" page=$page " )
478- params.add(" size=$size " )
479-
480- val queryString = if (params.isNotEmpty()) " ?${params.joinToString(" &" )} " else " "
481- return " redirect:/v1/admin/questions$queryString "
465+ return " redirect:/v1/admin/questions"
482466 }
483467
484468 @PostMapping(" /v1/admin/questions/{questionId}/toggle" )
485469 fun toggleQuestionStatus (
486470 @PathVariable questionId : Long ,
487- @RequestParam(required = false ) keyword : String? ,
488- @RequestParam(required = false ) category : String? ,
489- @RequestParam(required = false ) isActive : String? ,
490- @RequestParam(required = false , defaultValue = " 0" ) page : Int ,
491- @RequestParam(required = false , defaultValue = " 20" ) size : Int ,
492471 redirectAttributes : RedirectAttributes
493472 ): String {
494473 try {
@@ -498,17 +477,7 @@ class AdminController(
498477 } catch (e: Exception ) {
499478 redirectAttributes.addFlashAttribute(" error" , " 질문 상태 변경에 실패했습니다: ${e.message} " )
500479 }
501-
502- // 필터 조건 유지하여 리다이렉트
503- val params = mutableListOf<String >()
504- keyword?.let { if (it.isNotBlank()) params.add(" keyword=$it " ) }
505- category?.let { if (it.isNotBlank()) params.add(" category=$it " ) }
506- isActive?.let { if (it.isNotBlank()) params.add(" isActive=$it " ) }
507- params.add(" page=$page " )
508- params.add(" size=$size " )
509-
510- val queryString = if (params.isNotEmpty()) " ?${params.joinToString(" &" )} " else " "
511- return " redirect:/v1/admin/questions$queryString "
480+ return " redirect:/v1/admin/questions"
512481 }
513482
514483 // ========== 신고 관리 ==========
0 commit comments