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,46 @@
package gg.agit.konect.admin.website.controller;

import org.springframework.http.ResponseEntity;
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 gg.agit.konect.admin.website.dto.AdminWebsiteClubSheetImportConfirmRequest;
import gg.agit.konect.admin.website.dto.AdminWebsiteClubSheetImportPreviewResponse;
import gg.agit.konect.admin.website.dto.AdminWebsiteClubSheetImportRequest;
import gg.agit.konect.admin.website.dto.AdminWebsiteClubSheetImportResponse;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;

@Tag(name = "(Admin) Website Club Sheet Import", description = "konect.space λŒ€ν•™λ³„ 동아리 λͺ©λ‘ μ‹œνŠΈ 등둝 API")
@RequestMapping("/admin/konect/universities")
public interface AdminWebsiteClubSheetImportApi {

@Operation(
summary = "Google Sheets 동아리 등둝 양식을 읽고 미리보기 JSON을 λ°˜ν™˜ν•œλ‹€.",
description = """
κ³ μ •λœ μž‘μ„± μ‹œνŠΈ μ–‘μ‹μ˜ A~F μ»¬λŸΌμ„ 읽어 KONECT μ›Ήμ‚¬μ΄νŠΈμš© 동아리 JSON을 μƒμ„±ν•©λ‹ˆλ‹€.
이 APIλŠ” DB에 μ €μž₯ν•˜μ§€ μ•Šκ³ , μ‚¬μš©μžκ°€ 확인/μˆ˜μ •ν•  수 μžˆλŠ” 쀑간 결과만 λ°˜ν™˜ν•©λ‹ˆλ‹€.
"""
)
@PostMapping("/{universityId}/clubs/sheet/import/preview")
ResponseEntity<AdminWebsiteClubSheetImportPreviewResponse> previewClubs(
@PathVariable(name = "universityId") Integer universityId,
@Valid @RequestBody AdminWebsiteClubSheetImportRequest request
);

@Operation(
summary = "미리보기 JSON을 μ΅œμ’… 동아리 λͺ©λ‘μœΌλ‘œ μ €μž₯ν•œλ‹€.",
description = """
preview 응닡을 κ·ΈλŒ€λ‘œ λ³΄λ‚΄κ±°λ‚˜ μˆ˜μ •ν•œ λ’€ 보내면 web_club에 μ €μž₯ν•©λ‹ˆλ‹€.
enabled=false인 ν•­λͺ©κ³Ό 이미 같은 λŒ€ν•™μ— λ“±λ‘λœ 같은 μ΄λ¦„μ˜ λ™μ•„λ¦¬λŠ” μ €μž₯ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
"""
)
@PostMapping("/{universityId}/clubs/sheet/import/confirm")
ResponseEntity<AdminWebsiteClubSheetImportResponse> confirmImport(
@PathVariable(name = "universityId") Integer universityId,
@Valid @RequestBody AdminWebsiteClubSheetImportConfirmRequest request
);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package gg.agit.konect.admin.website.controller;

import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import gg.agit.konect.admin.website.dto.AdminWebsiteClubSheetImportConfirmRequest;
import gg.agit.konect.admin.website.dto.AdminWebsiteClubSheetImportPreviewResponse;
import gg.agit.konect.admin.website.dto.AdminWebsiteClubSheetImportRequest;
import gg.agit.konect.admin.website.dto.AdminWebsiteClubSheetImportResponse;
import gg.agit.konect.admin.website.service.AdminWebsiteClubSheetImportService;
import gg.agit.konect.domain.user.enums.UserRole;
import gg.agit.konect.global.auth.annotation.Auth;
import lombok.RequiredArgsConstructor;

@RestController
@RequiredArgsConstructor
@RequestMapping("/admin/konect/universities")
@Auth(roles = {UserRole.ADMIN})
public class AdminWebsiteClubSheetImportController implements AdminWebsiteClubSheetImportApi {

private final AdminWebsiteClubSheetImportService adminWebsiteClubSheetImportService;

@Override
public ResponseEntity<AdminWebsiteClubSheetImportPreviewResponse> previewClubs(
Integer universityId,
AdminWebsiteClubSheetImportRequest request
) {
AdminWebsiteClubSheetImportPreviewResponse response =
adminWebsiteClubSheetImportService.previewClubs(universityId, request.spreadsheetUrl());
return ResponseEntity.ok(response);
}

@Override
public ResponseEntity<AdminWebsiteClubSheetImportResponse> confirmImport(
Integer universityId,
AdminWebsiteClubSheetImportConfirmRequest request
) {
AdminWebsiteClubSheetImportResponse response =
adminWebsiteClubSheetImportService.confirmImport(universityId, request.clubs());
return ResponseEntity.ok(response);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package gg.agit.konect.admin.website.dto;

import java.util.List;

import gg.agit.konect.domain.club.enums.ClubCategory;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;

public record AdminWebsiteClubSheetImportConfirmRequest(

@NotEmpty
List<@Valid ConfirmClub> clubs
) {

public record ConfirmClub(
int rowNumber,

@NotBlank
@Size(max = 50)
String name,

@NotNull
ClubCategory clubCategory,

@NotBlank
@Size(max = 20)
String topic,

@NotBlank
@Size(max = 30)
String description,

@NotNull
String introduce,

@NotBlank
@Size(max = 255)
String categoryEmoji,

boolean enabled
) {
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package gg.agit.konect.admin.website.dto;

import java.util.List;

import gg.agit.konect.domain.club.enums.ClubCategory;

public record AdminWebsiteClubSheetImportPreviewResponse(
Integer universityId,
int previewCount,
List<PreviewClub> clubs,
List<String> warnings
) {

public static AdminWebsiteClubSheetImportPreviewResponse of(
Integer universityId,
List<PreviewClub> clubs,
List<String> warnings
) {
return new AdminWebsiteClubSheetImportPreviewResponse(
universityId,
clubs.size(),
clubs,
warnings == null ? List.of() : warnings
);
}

public record PreviewClub(
int rowNumber,
String name,
ClubCategory clubCategory,
String topic,
String description,
String introduce,
String categoryEmoji,
boolean enabled
) {
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package gg.agit.konect.admin.website.dto;

import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Pattern;

public record AdminWebsiteClubSheetImportRequest(

@Schema(
description = "동아리 등둝 양식 Google Sheets URL",
example = "https://docs.google.com/spreadsheets/d/1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgVE2upms/edit"
)
@NotBlank
@Pattern(regexp = "^https://docs\\.google\\.com/spreadsheets/(?:u/\\d+/)?d/[A-Za-z0-9_-]+.*")
String spreadsheetUrl
) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package gg.agit.konect.admin.website.dto;

import java.util.List;

public record AdminWebsiteClubSheetImportResponse(
int importedCount,
int skippedCount,
List<String> warnings
) {

public static AdminWebsiteClubSheetImportResponse of(
int importedCount,
int skippedCount,
List<String> warnings
) {
return new AdminWebsiteClubSheetImportResponse(
importedCount,
skippedCount,
warnings == null ? List.of() : warnings
);
}
}
Loading
Loading