Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
package com.swyp.picke.domain.admin.controller;

import com.swyp.picke.domain.admin.dto.battle.request.AdminBattleCreateRequest;
import com.swyp.picke.domain.admin.dto.battle.response.AdminBattleDeleteResponse;
import com.swyp.picke.domain.admin.dto.battle.response.AdminBattleDetailResponse;
import com.swyp.picke.domain.admin.dto.battle.request.AdminBattleUpdateRequest;
import com.swyp.picke.domain.admin.service.AdminBattleService;
import com.swyp.picke.global.common.response.ApiResponse;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PatchMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@Tag(name = "관리자 배틀 API", description = "관리자 배틀 콘텐츠 생성, 조회, 수정, 삭제")
@RestController
@RequestMapping("/api/v1/admin/battles")
@RequiredArgsConstructor
@PreAuthorize("hasRole('ADMIN')")
public class AdminBattleController {

private final AdminBattleService adminBattleService;

@Operation(summary = "배틀 생성")
@PostMapping
public ApiResponse<AdminBattleDetailResponse> createBattle(
@RequestBody @Valid AdminBattleCreateRequest request,
@AuthenticationPrincipal Long adminUserId
) {
return ApiResponse.onSuccess(adminBattleService.createBattle(request, adminUserId));
}

@Operation(summary = "배틀 상세 조회")
@GetMapping("/{battleId}")
public ApiResponse<AdminBattleDetailResponse> getBattleDetail(@PathVariable Long battleId) {
return ApiResponse.onSuccess(adminBattleService.getBattleDetail(battleId));
}

@Operation(summary = "배틀 수정")
@PatchMapping("/{battleId}")
public ApiResponse<AdminBattleDetailResponse> updateBattle(
@PathVariable Long battleId,
@RequestBody @Valid AdminBattleUpdateRequest request
) {
return ApiResponse.onSuccess(adminBattleService.updateBattle(battleId, request));
}

@Operation(summary = "배틀 삭제")
@DeleteMapping("/{battleId}")
public ApiResponse<AdminBattleDeleteResponse> deleteBattle(
@PathVariable Long battleId
) {
return ApiResponse.onSuccess(adminBattleService.deleteBattle(battleId));
}

@Operation(summary = "배틀 목록 조회")
@GetMapping
public ApiResponse<?> getBattles(
@RequestParam(value = "page", defaultValue = "1") int page,
@RequestParam(value = "size", defaultValue = "10") int size,
@RequestParam(value = "status", required = false) String status
) {
return ApiResponse.onSuccess(adminBattleService.getBattles(page, size, status));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
package com.swyp.picke.domain.admin.controller;

import com.swyp.picke.domain.admin.dto.notification.request.AdminNoticeCreateRequest;
import com.swyp.picke.domain.admin.dto.notification.response.AdminNoticeDetailResponse;
import com.swyp.picke.domain.admin.dto.notification.response.AdminNoticeListResponse;
import com.swyp.picke.domain.admin.service.AdminNotificationService;
import com.swyp.picke.domain.notification.enums.NotificationCategory;
import com.swyp.picke.global.common.response.ApiResponse;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@Tag(name = "관리자 공지 API", description = "공지사항/이벤트 작성 및 조회")
@RestController
@RequestMapping("/api/v1/admin/notices")
@RequiredArgsConstructor
@PreAuthorize("hasRole('ADMIN')")
public class AdminNotificationController {

private final AdminNotificationService adminNotificationService;

@Operation(summary = "공지사항 작성")
@PostMapping
public ApiResponse<AdminNoticeDetailResponse> createNotice(
@RequestBody @Valid AdminNoticeCreateRequest request
) {
return ApiResponse.onSuccess(adminNotificationService.createNotice(request));
}

@Operation(summary = "공지사항 목록 조회")
@GetMapping
public ApiResponse<AdminNoticeListResponse> getNotices(
@RequestParam(required = false) NotificationCategory category,
@RequestParam(defaultValue = "0") int page,
@RequestParam(defaultValue = "20") int size
) {
return ApiResponse.onSuccess(adminNotificationService.getNotices(category, page, size));
}

@Operation(summary = "공지사항 상세 조회")
@GetMapping("/{noticeId}")
public ApiResponse<AdminNoticeDetailResponse> getNoticeDetail(@PathVariable Long noticeId) {
return ApiResponse.onSuccess(adminNotificationService.getNoticeDetail(noticeId));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -44,4 +44,9 @@ public String pickeListPage() {
public String pickeCreatePage() {
return "admin/picke-create";
}

@GetMapping("/picke/notice")
public String noticePage() {
return "admin/admin-notice";
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
package com.swyp.picke.domain.admin.controller;

import com.swyp.picke.domain.admin.dto.poll.request.AdminPollCreateRequest;
import com.swyp.picke.domain.admin.dto.poll.request.AdminPollUpdateRequest;
import com.swyp.picke.domain.admin.dto.poll.response.AdminPollDeleteResponse;
import com.swyp.picke.domain.admin.dto.poll.response.AdminPollDetailResponse;
import com.swyp.picke.domain.admin.service.AdminPollService;
import com.swyp.picke.global.common.response.ApiResponse;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PatchMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@Tag(name = "관리자 투표 콘텐츠 API", description = "관리자 투표 콘텐츠 생성, 조회, 수정, 삭제")
@RestController
@RequestMapping("/api/v1/admin/polls")
@RequiredArgsConstructor
@PreAuthorize("hasRole('ADMIN')")
public class AdminPollController {

private final AdminPollService adminPollService;

@Operation(summary = "투표 콘텐츠 생성")
@PostMapping
public ApiResponse<AdminPollDetailResponse> createPoll(@RequestBody @Valid AdminPollCreateRequest request) {
return ApiResponse.onSuccess(adminPollService.createPoll(request));
}

@Operation(summary = "투표 콘텐츠 상세 조회")
@GetMapping("/{pollId}")
public ApiResponse<AdminPollDetailResponse> getPollDetail(@PathVariable Long pollId) {
return ApiResponse.onSuccess(adminPollService.getPollDetail(pollId));
}

@Operation(summary = "투표 콘텐츠 수정")
@PatchMapping("/{pollId}")
public ApiResponse<AdminPollDetailResponse> updatePoll(
@PathVariable Long pollId,
@RequestBody @Valid AdminPollUpdateRequest request
) {
return ApiResponse.onSuccess(adminPollService.updatePoll(pollId, request));
}

@Operation(summary = "투표 콘텐츠 삭제")
@DeleteMapping("/{pollId}")
public ApiResponse<AdminPollDeleteResponse> deletePoll(@PathVariable Long pollId) {
return ApiResponse.onSuccess(adminPollService.deletePoll(pollId));
}

@Operation(summary = "투표 콘텐츠 목록 조회")
@GetMapping
public ApiResponse<?> getPolls(
@RequestParam(value = "page", defaultValue = "1") int page,
@RequestParam(value = "size", defaultValue = "10") int size,
@RequestParam(value = "status", required = false) String status
) {
return ApiResponse.onSuccess(adminPollService.getPolls(page, size, status));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
package com.swyp.picke.domain.admin.controller;

import com.swyp.picke.domain.admin.dto.quiz.request.AdminQuizCreateRequest;
import com.swyp.picke.domain.admin.dto.quiz.request.AdminQuizUpdateRequest;
import com.swyp.picke.domain.admin.dto.quiz.response.AdminQuizDeleteResponse;
import com.swyp.picke.domain.admin.dto.quiz.response.AdminQuizDetailResponse;
import com.swyp.picke.domain.admin.service.AdminQuizService;
import com.swyp.picke.global.common.response.ApiResponse;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PatchMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@Tag(name = "관리자 퀴즈 API", description = "관리자 퀴즈 콘텐츠 생성, 조회, 수정, 삭제")
@RestController
@RequestMapping("/api/v1/admin/quizzes")
@RequiredArgsConstructor
@PreAuthorize("hasRole('ADMIN')")
public class AdminQuizController {

private final AdminQuizService adminQuizService;

@Operation(summary = "퀴즈 생성")
@PostMapping
public ApiResponse<AdminQuizDetailResponse> createQuiz(@RequestBody @Valid AdminQuizCreateRequest request) {
return ApiResponse.onSuccess(adminQuizService.createQuiz(request));
}

@Operation(summary = "퀴즈 상세 조회")
@GetMapping("/{quizId}")
public ApiResponse<AdminQuizDetailResponse> getQuizDetail(@PathVariable Long quizId) {
return ApiResponse.onSuccess(adminQuizService.getQuizDetail(quizId));
}

@Operation(summary = "퀴즈 수정")
@PatchMapping("/{quizId}")
public ApiResponse<AdminQuizDetailResponse> updateQuiz(
@PathVariable Long quizId,
@RequestBody @Valid AdminQuizUpdateRequest request
) {
return ApiResponse.onSuccess(adminQuizService.updateQuiz(quizId, request));
}

@Operation(summary = "퀴즈 삭제")
@DeleteMapping("/{quizId}")
public ApiResponse<AdminQuizDeleteResponse> deleteQuiz(@PathVariable Long quizId) {
return ApiResponse.onSuccess(adminQuizService.deleteQuiz(quizId));
}

@Operation(summary = "퀴즈 목록 조회")
@GetMapping
public ApiResponse<?> getQuizzes(
@RequestParam(value = "page", defaultValue = "1") int page,
@RequestParam(value = "size", defaultValue = "10") int size,
@RequestParam(value = "status", required = false) String status
) {
return ApiResponse.onSuccess(adminQuizService.getQuizzes(page, size, status));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
package com.swyp.picke.domain.admin.controller;

import com.swyp.picke.domain.admin.dto.scenario.request.AdminScenarioCreateRequest;
import com.swyp.picke.domain.admin.dto.scenario.request.AdminScenarioStatusUpdateRequest;
import com.swyp.picke.domain.admin.dto.scenario.response.AdminDeleteResponse;
import com.swyp.picke.domain.admin.dto.scenario.response.AdminScenarioCreateResponse;
import com.swyp.picke.domain.admin.dto.scenario.response.AdminScenarioDetailResponse;
import com.swyp.picke.domain.admin.dto.scenario.response.AdminScenarioResponse;
import com.swyp.picke.domain.admin.service.AdminScenarioService;
import com.swyp.picke.global.common.response.ApiResponse;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PatchMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestController;

@Tag(name = "관리자 시나리오 API", description = "관리자 시나리오 생성, 조회, 수정, 삭제")
@RestController
@RequestMapping("/api/v1/admin")
@RequiredArgsConstructor
@PreAuthorize("hasRole('ADMIN')")
public class AdminScenarioController {

private final AdminScenarioService adminScenarioService;

@Operation(summary = "배틀 시나리오 상세 조회")
@GetMapping("/battles/{battleId}/scenario")
public ApiResponse<AdminScenarioDetailResponse> getAdminBattleScenario(@PathVariable Long battleId) {
return ApiResponse.onSuccess(adminScenarioService.getScenarioForAdmin(battleId));
}

@Operation(summary = "시나리오 생성")
@PostMapping("/scenarios")
@ResponseStatus(HttpStatus.CREATED)
public ApiResponse<AdminScenarioCreateResponse> createScenario(@RequestBody AdminScenarioCreateRequest request) {
return ApiResponse.onSuccess(adminScenarioService.createScenario(request));
}

@Operation(summary = "시나리오 본문 수정")
@PutMapping("/scenarios/{scenarioId}")
public ApiResponse<Void> updateScenarioContent(
@PathVariable Long scenarioId,
@RequestBody AdminScenarioCreateRequest request
) {
adminScenarioService.updateScenarioContent(scenarioId, request);
return ApiResponse.onSuccess(null);
}

@Operation(summary = "시나리오 상태 수정")
@PatchMapping("/scenarios/{scenarioId}")
public ApiResponse<AdminScenarioResponse> updateScenarioStatus(
@PathVariable Long scenarioId,
@RequestBody AdminScenarioStatusUpdateRequest request
) {
return ApiResponse.onSuccess(adminScenarioService.updateScenarioStatus(scenarioId, request.status()));
}

@Operation(summary = "시나리오 삭제")
@DeleteMapping("/scenarios/{scenarioId}")
public ApiResponse<AdminDeleteResponse> deleteScenario(@PathVariable Long scenarioId) {
return ApiResponse.onSuccess(adminScenarioService.deleteScenario(scenarioId));
}
}
Loading