Skip to content

Commit

Permalink
Merge pull request #5 from Timetris-Trendithon/feat/소셜로그인
Browse files Browse the repository at this point in the history
✨Feat: 소셜로그인 구현
  • Loading branch information
jiinkyung authored Feb 17, 2024
2 parents d71716f + 4254d21 commit a929bea
Show file tree
Hide file tree
Showing 58 changed files with 1,594 additions and 31 deletions.
4 changes: 3 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -39,4 +39,6 @@ out/
# Ignore .DS_Store files
.DS_Store

application.yml
application.yml
application-oauth.yml
application-jwt.yml
4 changes: 4 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,10 @@ dependencies {

implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.0.2'

// oauth, jwt
implementation 'org.springframework.boot:spring-boot-starter-oauth2-client'
implementation 'com.auth0:java-jwt:4.4.0'


runtimeOnly 'com.mysql:mysql-connector-j'
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.trendithon.timetris.domain.login.domain;

import lombok.Getter;
import lombok.RequiredArgsConstructor;

@Getter
@RequiredArgsConstructor
public enum Role {
GUEST("ROLE_GUEST"), USER("ROLE_USER");

private final String key;
}
55 changes: 45 additions & 10 deletions src/main/java/com/trendithon/timetris/domain/login/domain/User.java
Original file line number Diff line number Diff line change
@@ -1,20 +1,55 @@
package com.trendithon.timetris.domain.login.domain;

import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import jakarta.persistence.*;
import jakarta.validation.constraints.NotNull;
import lombok.*;

@Entity
@Getter
@AllArgsConstructor @NoArgsConstructor
@Builder
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor
public class User {

@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@NotNull
private String name;

@NotNull
private String email;

@Column
private String profile;

@Enumerated(EnumType.STRING)
private Role role;

private String refreshToken;


// 로그인 할 때마다 해당 필드 새롭게 업데이트
public User update(String name, String email) {
this.name = name;
this.email = email;

return this;
}

public String getRoleKey() {
return this.role.getKey();
}

// 유저 권한설정 메소드
public void authorizeUser() {
this.role = Role.USER;
}


public void updateRefreshToken(String updateRefreshToken) {
this.refreshToken = updateRefreshToken;
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.trendithon.timetris.domain.login.repository;

import com.trendithon.timetris.domain.login.domain.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

import java.util.Optional;

@Repository
public interface UserRepository extends JpaRepository<User, Long> {
Optional<User> findByEmail(String email);
}
Empty file.
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
package com.trendithon.timetris.domain.mainpage.controller;

import com.trendithon.timetris.domain.mainpage.domain.Category;
import com.trendithon.timetris.domain.mainpage.dto.CategoryCreateDTO;
import com.trendithon.timetris.domain.mainpage.dto.CategoryRequestDTO;
import com.trendithon.timetris.domain.mainpage.dto.CategoryViewDTO;
import com.trendithon.timetris.domain.mainpage.service.CategoryService;
import com.trendithon.timetris.global.exception.ApiResponse;
import com.trendithon.timetris.global.exception.CustomException;
import com.trendithon.timetris.global.exception.enums.ErrorStatus;
import com.trendithon.timetris.global.exception.enums.SuccessStatus;
import lombok.RequiredArgsConstructor;
import org.springframework.security.core.Authentication;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequiredArgsConstructor
@RequestMapping("/category")
public class CategoryController {

private final CategoryService categoryService;

@GetMapping("/{userId}")
public ApiResponse<List<Category>> readCategoryAll(Authentication authentication,
@PathVariable long userId)
{
List<Category> categoryList = categoryService.readCategoryAll(userId);
return ApiResponse.success(SuccessStatus.OK, categoryList);
}

@PostMapping("")
public ApiResponse createCategory(Authentication authentication,
@RequestBody CategoryRequestDTO categoryRequestDTO)
{
long userId = 1;
Category category = categoryService.createCategory(userId, categoryRequestDTO);
if (category == null){
throw new CustomException(ErrorStatus.INVALID_FORMAT_ERROR);
}
return ApiResponse.success(SuccessStatus.OK);
}

@PutMapping("/{categoryId}")
public ApiResponse updateCategory(Authentication authentication,
@PathVariable long categoryId,
@RequestBody CategoryViewDTO categoryViewDTO)
{
long userId = 1;
categoryService.updateCategory(userId, categoryId, categoryViewDTO);
return ApiResponse.success(SuccessStatus.OK);
}

@DeleteMapping("/{categoryId}")
public ApiResponse deleteCategory(Authentication authentication,
@PathVariable long categoryId)
{
long userId = 1;
categoryService.deleteCategory(userId, categoryId);
return ApiResponse.success(SuccessStatus.OK);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
package com.trendithon.timetris.domain.mainpage.controller;

import com.trendithon.timetris.domain.mainpage.domain.Do;
import com.trendithon.timetris.domain.mainpage.dto.DoCreateDTO;
import com.trendithon.timetris.domain.mainpage.dto.DoRequestDTO;
import com.trendithon.timetris.domain.mainpage.dto.DoViewDTO;
import com.trendithon.timetris.domain.mainpage.service.DoService;
import com.trendithon.timetris.global.exception.ApiResponse;
import com.trendithon.timetris.global.exception.CustomException;
import com.trendithon.timetris.global.exception.enums.ErrorStatus;
import com.trendithon.timetris.global.exception.enums.SuccessStatus;
import lombok.RequiredArgsConstructor;
import org.springframework.security.core.Authentication;
import org.springframework.web.bind.annotation.*;

@RestController
@RequiredArgsConstructor
@RequestMapping("/do")
public class DoController {

private final DoService doService;

@PostMapping("")
public ApiResponse createDo(Authentication authentication,
@RequestBody DoRequestDTO doRequestDTO)
{
long userId = 1;
Do done = doService.createDo(userId, doRequestDTO);
if (done == null){
throw new CustomException(ErrorStatus.INVALID_FORMAT_ERROR);
}
return ApiResponse.success(SuccessStatus.OK);
}

@PutMapping("/{doId}")
public ApiResponse updateDo(Authentication authentication,
@PathVariable long doId,
@RequestBody DoViewDTO doViewDTO)
{
long userId = 1;
doService.updateDo(userId, doId, doViewDTO);
return ApiResponse.success(SuccessStatus.OK);
}

@DeleteMapping("/{doId}")
public ApiResponse deleteDo(Authentication authentication,
@PathVariable long doId)
{
long userId = 1;
doService.deleteDo(userId, doId);
return ApiResponse.success(SuccessStatus.OK);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package com.trendithon.timetris.domain.mainpage.controller;

import com.trendithon.timetris.domain.mainpage.dto.MainPageDTO;
import com.trendithon.timetris.domain.mainpage.service.MainPageService;
import com.trendithon.timetris.global.exception.ApiResponse;
import com.trendithon.timetris.global.exception.enums.SuccessStatus;
import lombok.RequiredArgsConstructor;
import org.springframework.security.core.Authentication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.time.LocalDate;

@RestController
@RequiredArgsConstructor
@RequestMapping("/main")
public class MainPageController {

private final MainPageService mainPageService;

@GetMapping("/{userId}")
public ApiResponse<MainPageDTO> getMainPage(Authentication authentication,
@PathVariable long userId)
{
MainPageDTO mainPageDTO = mainPageService.getMainPage(userId);
return ApiResponse.success(SuccessStatus.OK, mainPageDTO);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
package com.trendithon.timetris.domain.mainpage.controller;

import com.trendithon.timetris.domain.mainpage.domain.Plan;
import com.trendithon.timetris.domain.mainpage.dto.PlanCreateDTO;
import com.trendithon.timetris.domain.mainpage.dto.PlanRequestDTO;
import com.trendithon.timetris.domain.mainpage.dto.PlanViewDTO;
import com.trendithon.timetris.domain.mainpage.service.PlanService;
import com.trendithon.timetris.global.exception.ApiResponse;
import com.trendithon.timetris.global.exception.CustomException;
import com.trendithon.timetris.global.exception.enums.ErrorStatus;
import com.trendithon.timetris.global.exception.enums.SuccessStatus;
import lombok.RequiredArgsConstructor;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.web.bind.annotation.*;

@RestController
@RequiredArgsConstructor
@RequestMapping("/plan")
public class PlanController {

private final PlanService planService;

@PostMapping("")
public ApiResponse createPlan(Authentication authentication,
@RequestBody PlanRequestDTO planRequestDTO)
{
long userId = 1;
Plan plan = planService.createPlan(userId, planRequestDTO);
if (plan == null){
throw new CustomException(ErrorStatus.INVALID_FORMAT_ERROR);
}
return ApiResponse.success(SuccessStatus.OK);
}

@PutMapping("/{planId}")
public ApiResponse updatePlan(Authentication authentication,
@PathVariable long planId,
@RequestBody PlanViewDTO planViewDTO)
{
long userId = 1;
planService.updatePlan(userId, planId, planViewDTO);
return ApiResponse.success(SuccessStatus.OK);
}

@DeleteMapping("/{planId}")
public ApiResponse deletePlan(Authentication authentication,
@PathVariable long planId)
{
long userId = 1;
planService.deletePlan(userId, planId);
return ApiResponse.success(SuccessStatus.OK);
}

@PutMapping("/{planId}/check")
public ApiResponse donePlan(Authentication authentication,
@PathVariable long planId)
{
long userId = 1;
planService.donePlan(userId, planId);
return ApiResponse.success(SuccessStatus.OK);
}



}
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
package com.trendithon.timetris.domain.mainpage.controller;

import com.trendithon.timetris.domain.mainpage.domain.See;
import com.trendithon.timetris.domain.mainpage.dto.SeeCreateDTO;
import com.trendithon.timetris.domain.mainpage.dto.SeeRequestDTO;
import com.trendithon.timetris.domain.mainpage.dto.SeeViewDTO;
import com.trendithon.timetris.domain.mainpage.service.SeeService;
import com.trendithon.timetris.global.exception.ApiResponse;
import com.trendithon.timetris.global.exception.CustomException;
import com.trendithon.timetris.global.exception.enums.ErrorStatus;
import com.trendithon.timetris.global.exception.enums.SuccessStatus;
import lombok.RequiredArgsConstructor;
import org.springframework.security.core.Authentication;
import org.springframework.web.bind.annotation.*;

@RestController
@RequiredArgsConstructor
@RequestMapping("/see")
public class SeeController {

private final SeeService seeService;

@PostMapping("")
public ApiResponse createSee(Authentication authentication,
@RequestBody SeeRequestDTO seeRequestDTO)
{
long userId = 1;
See see = seeService.createSee(userId, seeRequestDTO);
if (see == null){
throw new CustomException(ErrorStatus.SEE_NOT_FOUND_ERROR);
}
return ApiResponse.success(SuccessStatus.OK);
}

@PutMapping("/{seeId}")
public ApiResponse updateSee(Authentication authentication,
@PathVariable long seeId,
@RequestBody SeeViewDTO seeViewDTO)
{
long userId = 1;
seeService.updateSee(userId, seeId, seeViewDTO);
return ApiResponse.success(SuccessStatus.OK);
}

@DeleteMapping("/{seeId}")
public ApiResponse deleteSee(Authentication authentication,
@PathVariable long seeId)
{
long userId = 1;
seeService.deleteSee(userId, seeId);
return ApiResponse.success(SuccessStatus.OK);
}

}
Loading

0 comments on commit a929bea

Please sign in to comment.