Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[FEAT] user API 마무리 #76

Open
wants to merge 11 commits into
base: feat/43-user-api/base
Choose a base branch
from
9 changes: 9 additions & 0 deletions src/docs/asciidoc/department.adoc
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
== 학과 API
:source-highlighter: highlightjs

---

=== 학과 리스트 조회 (GET /departments)
====
operation::department-controller-test/get-departments[snippets="http-request,http-response,response-fields"]
====
3 changes: 2 additions & 1 deletion src/docs/asciidoc/index.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,5 @@
:seclinks:

include::auth-controller-test.adoc[]
include::user-controller-test.adoc[]
include::user.adoc[]
include::department.adoc[]
19 changes: 0 additions & 19 deletions src/docs/asciidoc/user-controller-test.adoc

This file was deleted.

34 changes: 34 additions & 0 deletions src/docs/asciidoc/user.adoc
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
== 유저 API
:source-highlighter: highlightjs

---

=== 로그인 유저 기본 정보 조회 (GET /users/me)
====
operation::user-controller-test/get-me[snippets="http-request,http-response,response-fields"]
====

=== 로그인 유저 기본 정보 수정 (PUT /users/me)
====
operation::user-controller-test/update-me[snippets="http-request,request-fields,http-response,response-fields"]
====

=== 유저 탈퇴 (DELETE /users/me)
====
operation::user-controller-test/delete-me[snippets="http-request,http-response"]
====

=== 유저 관심 리스트 조회 (GET /users/favorites)
====
operation::user-controller-test/get-user-favorites[snippets="http-request,query-parameters,http-response,response-fields"]
====

=== 유저 문의 리스트 조회 (GET /users/inquiries)
====
operation::user-controller-test/get-user-inquiries[snippets="http-request,http-response,response-fields"]
====

=== 유저 과제 제안 리스트 조회 (GET /users/proposals)
====
operation::user-controller-test/get-user-proposals[snippets="http-request,http-response,response-fields"]
====
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.scg.stop.domain.project.repository;

import com.scg.stop.domain.project.domain.FavoriteProject;
import com.scg.stop.domain.project.domain.Project;
import com.scg.stop.user.domain.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;

import java.util.List;

public interface FavoriteProjectRepository extends JpaRepository<FavoriteProject, Long> {
@Query("SELECT f.project FROM FavoriteProject f WHERE f.user = :user")
List<Project> findAllByUser(@Param("user") User user);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.scg.stop.domain.project.repository;

import com.scg.stop.domain.project.domain.Inquiry;
import com.scg.stop.user.domain.User;
import org.springframework.data.jpa.repository.JpaRepository;

import java.util.List;

public interface InquiryRepository extends JpaRepository<Inquiry, Long> {
List<Inquiry> findByUser(User user);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.scg.stop.domain.proposal.repository;

import com.scg.stop.domain.project.domain.Inquiry;
import com.scg.stop.domain.proposal.domain.Proposal;
import com.scg.stop.user.domain.User;
import org.springframework.data.jpa.repository.JpaRepository;

import java.util.List;

public interface ProposalRepository extends JpaRepository<Proposal, Long> {
List<Proposal> findByUser(User user);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.scg.stop.domain.video.repository;

import com.scg.stop.domain.video.domain.FavoriteVideo;
import com.scg.stop.domain.video.domain.JobInterview;
import com.scg.stop.domain.video.domain.Talk;
import com.scg.stop.user.domain.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;

import java.util.List;

public interface FavoriteVideoRepository extends JpaRepository<FavoriteVideo, Long> {
@Query("SELECT f.talk FROM FavoriteVideo f WHERE f.user = :user AND f.talk IS NOT NULL")
List<Talk> findTalksByUser(@Param("user") User user);

@Query("SELECT f.jobInterview FROM FavoriteVideo f WHERE f.user = :user AND f.jobInterview IS NOT NULL")
List<JobInterview> findJobInterviewsByUser(@Param("user") User user);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package com.scg.stop.user.controller;

import com.scg.stop.user.dto.response.DepartmentResponse;
import com.scg.stop.user.service.DepartmentService;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
@RequiredArgsConstructor
@RequestMapping("/departments")
public class DepartmentController {

private final DepartmentService departmentService;

@GetMapping
public ResponseEntity<List<DepartmentResponse>> getDepartments() {
List<DepartmentResponse> departments = departmentService.getDepartments();
return ResponseEntity.ok(departments);
}
}
27 changes: 27 additions & 0 deletions src/main/java/com/scg/stop/user/controller/UserController.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,21 @@

import com.scg.stop.auth.annotation.AuthUser;
import com.scg.stop.user.domain.AccessType;
import com.scg.stop.user.domain.FavoriteType;
import com.scg.stop.user.domain.User;
import com.scg.stop.user.dto.request.UserUpdateRequest;
import com.scg.stop.user.dto.response.FavoriteResponse;
import com.scg.stop.user.dto.response.UserInquiryResponse;
import com.scg.stop.user.dto.response.UserProposalResponse;
import com.scg.stop.user.dto.response.UserResponse;
import com.scg.stop.user.service.UserService;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequiredArgsConstructor
@RequestMapping("/users")
Expand Down Expand Up @@ -38,4 +44,25 @@ public ResponseEntity<Void> deleteMe(@AuthUser(accessType = {AccessType.ALL}) Us
userService.deleteMe(user);
return ResponseEntity.noContent().build();
}

@GetMapping("/inquiries")
public ResponseEntity<List<UserInquiryResponse>> getUserInquiries(@AuthUser(accessType = {AccessType.ALL}) User user) {
List<UserInquiryResponse> inquiries = userService.getUserInquiries(user);
return ResponseEntity.ok(inquiries);
}

@GetMapping("/proposals")
public ResponseEntity<List<UserProposalResponse>> getUserProposals(@AuthUser(accessType = {AccessType.ALL}) User user) {
List<UserProposalResponse> proposals = userService.getUserProposals(user);
return ResponseEntity.ok(proposals);
}

@GetMapping("/favorites")
public ResponseEntity<List<FavoriteResponse>> getUserFavorites(
@AuthUser(accessType = {AccessType.ALL}) User user,
@RequestParam("type") FavoriteType type
) {
List<FavoriteResponse> userFavorites = userService.getUserFavorites(user, type);
return ResponseEntity.ok(userFavorites);
}
}
7 changes: 7 additions & 0 deletions src/main/java/com/scg/stop/user/domain/FavoriteType.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.scg.stop.user.domain;

public enum FavoriteType {
PROJECT, // 프로젝트
TALK, // 대담영상
JOBINTERVIEW // 잡페어영상
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.scg.stop.user.dto.response;

import com.scg.stop.user.domain.Department;
import lombok.AllArgsConstructor;
import lombok.Getter;

@Getter
@AllArgsConstructor
public class DepartmentResponse {

private Long id;
private String name;

public static DepartmentResponse from(Department department) {
return new DepartmentResponse(
department.getId(),
department.getName()
);
}
}
17 changes: 17 additions & 0 deletions src/main/java/com/scg/stop/user/dto/response/FavoriteResponse.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.scg.stop.user.dto.response;

import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Getter;

@Getter
@AllArgsConstructor(access = AccessLevel.PRIVATE)
public class FavoriteResponse {
private Long id;
private String title;
private String youtubeId;

public static FavoriteResponse of(Long id, String title, String youtubeId) {
return new FavoriteResponse(id, title, youtubeId);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package com.scg.stop.user.dto.response;

import com.scg.stop.domain.project.domain.Inquiry;
import lombok.AllArgsConstructor;
import lombok.Getter;

import java.time.LocalDateTime;

import static lombok.AccessLevel.PRIVATE;

@Getter
@AllArgsConstructor
public class UserInquiryResponse {

private Long id;
private String title;
private Long projectId;
private LocalDateTime createdDate;

public static UserInquiryResponse from(Inquiry inquiry) {
return new UserInquiryResponse(
inquiry.getId(),
inquiry.getTitle(),
inquiry.getProject() != null ? inquiry.getProject().getId() : null,
inquiry.getCreatedAt()
);
}
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package com.scg.stop.user.dto.response;

import com.scg.stop.domain.project.domain.Inquiry;
import com.scg.stop.domain.proposal.domain.Proposal;
import lombok.AllArgsConstructor;
import lombok.Getter;

import java.time.LocalDateTime;

import static lombok.AccessLevel.PRIVATE;

@Getter
@AllArgsConstructor
public class UserProposalResponse {

private Long id;
private String title;
private LocalDateTime createdDate;

public static UserProposalResponse from(Proposal proposal) {
return new UserProposalResponse(
proposal.getId(),
proposal.getTitle(),
proposal.getCreatedAt()
);
}
}
26 changes: 26 additions & 0 deletions src/main/java/com/scg/stop/user/service/DepartmentService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package com.scg.stop.user.service;

import com.scg.stop.user.dto.response.DepartmentResponse;
import com.scg.stop.user.repository.DepartmentRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.stream.Collectors;

@Service
@RequiredArgsConstructor
@Transactional
public class DepartmentService {

private final DepartmentRepository departmentRepository;

@Transactional(readOnly = true)
public List<DepartmentResponse> getDepartments() {
return departmentRepository.findAll()
.stream()
.map(DepartmentResponse::from)
.collect(Collectors.toList());
}
}
Loading