Skip to content

Commit

Permalink
Merge pull request #14 from jumining/feat/#9-post-challenge-create-api
Browse files Browse the repository at this point in the history
feat - ๋„๋ฉ”์ธ ์„ค์ • ๋ฐ ์ฑŒ๋ฆฐ์ง€ ์ƒ์„ฑ api ๊ตฌํ˜„
  • Loading branch information
jumining authored Jan 9, 2024
2 parents ae29796 + a24a6a1 commit c95c09d
Show file tree
Hide file tree
Showing 36 changed files with 523 additions and 32 deletions.

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package sopt.org.HMH.domain.app.controller;

import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequiredArgsConstructor
@RequestMapping("/api/v1/app")
public class AppController {
}
34 changes: 34 additions & 0 deletions src/main/java/sopt/org/HMH/domain/app/domain/App.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package sopt.org.HMH.domain.app.domain;

import jakarta.persistence.*;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import sopt.org.HMH.domain.dayChallenge.domain.DayChallenge;

@Entity
@Getter
@NoArgsConstructor
@Table(name = "app")
public class App {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "app_id")
private Long id;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "day_challenge_id")
private DayChallenge dayChallenge;

private String appCode;
private Long useTime;
private Long goalTime;

public App(DayChallenge dayChallenge, String appCode, Long goalTime) {
this.dayChallenge = dayChallenge;
this.appCode = appCode;
this.useTime = 0L;
this.goalTime = goalTime;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package sopt.org.HMH.domain.app.dto.request;

public record AppGoalTimeRequest(
String appCode,
Long goalTime
) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package sopt.org.HMH.domain.app.repository;

import org.springframework.data.jpa.repository.JpaRepository;
import sopt.org.HMH.domain.app.domain.App;

public interface AppRepository extends JpaRepository<App, Long> {
}
31 changes: 31 additions & 0 deletions src/main/java/sopt/org/HMH/domain/app/service/AppService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package sopt.org.HMH.domain.app.service;

import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import sopt.org.HMH.domain.app.domain.App;
import sopt.org.HMH.domain.app.dto.request.AppGoalTimeRequest;
import sopt.org.HMH.domain.app.repository.AppRepository;
import sopt.org.HMH.domain.dayChallenge.domain.DayChallenge;
import sopt.org.HMH.domain.dayChallenge.repository.DayChallengeRepository;

import java.util.ArrayList;
import java.util.List;

@Service
@RequiredArgsConstructor
public class AppService {

private final AppRepository appRepository;
private final DayChallengeRepository dayChallengeRepository;

public List<App> addApp(Long dayChallengeId, List<AppGoalTimeRequest> requests) {
DayChallenge dayChallenge = dayChallengeRepository.findByIdOrThrowException(dayChallengeId);

List<App> apps = new ArrayList<>();
for (AppGoalTimeRequest request: requests) {
appRepository.save(new App(dayChallenge, request.appCode(), request.goalTime()));
}

return apps;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package sopt.org.HMH.domain.challenge.controller;

import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
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.RestController;
import sopt.org.HMH.domain.challenge.domain.exception.ChallengeSuccess;
import sopt.org.HMH.domain.challenge.dto.request.ChallengeRequest;
import sopt.org.HMH.domain.challenge.service.ChallengeService;
import sopt.org.HMH.global.common.response.ApiResponse;

@RestController
@RequiredArgsConstructor
@RequestMapping("/api/v1/challenge")
public class ChallengeController {

private final ChallengeService challengeService;

@PostMapping
public ResponseEntity<ApiResponse> orderAdd(@RequestBody ChallengeRequest request) {
// TODO: - ํ† ํฐ์œผ๋กœ ์œ ์ € ์•„์ด๋”” ์ฐพ๋Š” ํ•จ์ˆ˜ ์—ฐ๊ฒฐ
return ResponseEntity
.status(ChallengeSuccess.SUCCESS_CREATE_CHALLENGE.getHttpStatus())
.body(ApiResponse.success(ChallengeSuccess.SUCCESS_CREATE_CHALLENGE, challengeService.addChallenge(1L, request)));
}
}
41 changes: 41 additions & 0 deletions src/main/java/sopt/org/HMH/domain/challenge/domain/Challenge.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package sopt.org.HMH.domain.challenge.domain;

import static jakarta.persistence.FetchType.*;
import static jakarta.persistence.GenerationType.*;

import jakarta.persistence.*;
import lombok.Getter;
import lombok.NoArgsConstructor;
import sopt.org.HMH.global.common.domain.BaseTimeEntity;
import sopt.org.HMH.domain.dayChallenge.domain.DayChallenge;
import sopt.org.HMH.domain.user.User;

import java.util.ArrayList;
import java.util.List;

@Entity
@Getter
@NoArgsConstructor
@Table(name = "challenge")
public class Challenge extends BaseTimeEntity {

@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "challenge_id")
private Long id;

@ManyToOne(fetch = LAZY)
@JoinColumn(name = "user_id")
private User user;

private Integer period;

@OneToMany(mappedBy = "challenge")
private List<DayChallenge> dayChallenges;

public Challenge(User user, Integer period) {
this.user = user;
this.period = period;
this.dayChallenges = new ArrayList<>();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package sopt.org.HMH.domain.challenge.domain.exception;

import lombok.AllArgsConstructor;
import org.springframework.http.HttpStatus;
import sopt.org.HMH.global.common.exception.base.ErrorBase;

@AllArgsConstructor
public enum ChallengeError implements ErrorBase {
CHALLENGE_NOT_FOUND(HttpStatus.NOT_FOUND, "์ฑŒ๋ฆฐ์ง€ ์ฐพ๊ธฐ ๋ถˆ๊ฐ€"),
;

private final HttpStatus status;
private final String errorMessage;

@Override
public int getHttpStatusCode() {
return status.value();
}

@Override
public HttpStatus getHttpStatus() {
return this.status;
}

@Override
public String getErrorMessage() {
return this.errorMessage;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package sopt.org.HMH.domain.challenge.domain.exception;

import sopt.org.HMH.global.common.exception.base.ExceptionBase;

public class ChallengeException extends ExceptionBase {
public ChallengeException(ChallengeError error) {
super(error);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package sopt.org.HMH.domain.challenge.domain.exception;

import lombok.AllArgsConstructor;
import org.springframework.http.HttpStatus;
import sopt.org.HMH.global.common.exception.base.SuccessBase;

@AllArgsConstructor
public enum ChallengeSuccess implements SuccessBase {
SUCCESS_CREATE_CHALLENGE(HttpStatus.OK, "์ฑŒ๋ฆฐ์ง€ ์ƒ์„ฑ ์„ฑ๊ณต"),
;

private final HttpStatus status;
private final String successMessage;

@Override
public int getHttpStatusCode() {
return this.status.value();
}

@Override
public HttpStatus getHttpStatus() {
return this.status;
}

@Override
public String getSuccessMessage() {
return this.successMessage;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package sopt.org.HMH.domain.challenge.dto.request;

import sopt.org.HMH.domain.app.dto.request.AppGoalTimeRequest;

import java.util.List;

public record ChallengeRequest(
Integer period,
Long goalTime,
List<AppGoalTimeRequest> apps
) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package sopt.org.HMH.domain.challenge.dto.response;

public record CreatedChallengeResponse(
Long challengeId
) {
public static CreatedChallengeResponse of(Long challengeId) {
return new CreatedChallengeResponse(challengeId);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package sopt.org.HMH.domain.challenge.repository;

import org.springframework.data.jpa.repository.JpaRepository;
import sopt.org.HMH.domain.challenge.domain.Challenge;

public interface ChallengeRepository extends JpaRepository<Challenge, Long> {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package sopt.org.HMH.domain.challenge.service;

import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import sopt.org.HMH.domain.app.domain.App;
import sopt.org.HMH.domain.app.service.AppService;
import sopt.org.HMH.domain.challenge.domain.Challenge;
import sopt.org.HMH.domain.challenge.dto.request.ChallengeRequest;
import sopt.org.HMH.domain.challenge.dto.response.CreatedChallengeResponse;
import sopt.org.HMH.domain.challenge.repository.ChallengeRepository;
import sopt.org.HMH.domain.dayChallenge.service.DayChallengeService;
import sopt.org.HMH.domain.user.User;
import sopt.org.HMH.domain.user.service.UserService;

@Service
@RequiredArgsConstructor
public class ChallengeService {

private final ChallengeRepository challengeRepository;

private final DayChallengeService dayChallengeService;
private final AppService appService;
private final UserService userService;

public CreatedChallengeResponse addChallenge(Long userId, ChallengeRequest request) {
User user = userService.getUserId(userId);
Challenge challenge = challengeRepository.save(new Challenge(user, request.period()));
Long dayChallengeId = dayChallengeService.addDayChallenge(challenge, request.goalTime());
appService.addApp(dayChallengeId, request.apps());

return CreatedChallengeResponse.of(challenge.getId());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package sopt.org.HMH.domain.dayChallenge.domain;

import static jakarta.persistence.FetchType.*;
import static jakarta.persistence.GenerationType.*;

import jakarta.persistence.*;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import sopt.org.HMH.domain.app.domain.App;
import sopt.org.HMH.global.common.domain.BaseTimeEntity;
import sopt.org.HMH.domain.challenge.domain.Challenge;

import java.util.List;

@Entity
@Getter
@NoArgsConstructor
@Table(name = "day_challenge")
public class DayChallenge extends BaseTimeEntity {

@Id
@GeneratedValue(strategy = IDENTITY)
private Long Id;

@ManyToOne(fetch = LAZY)
@JoinColumn(name = "challenge_id")
private Challenge challenge;

private Long goalTime;
private Boolean isSuccess;
private Boolean didGettingPoint;

@OneToMany(mappedBy = "dayChallenge")
private List<App> apps;

@Builder
public DayChallenge(Challenge challenge, Long goalTime) {
this.challenge = challenge;
this.goalTime = goalTime;
this.isSuccess = false;
this.didGettingPoint = false;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package sopt.org.HMH.domain.dayChallenge.domain.exception;

import lombok.AllArgsConstructor;
import org.springframework.http.HttpStatus;
import sopt.org.HMH.global.common.exception.base.ErrorBase;

@AllArgsConstructor
public enum DayChallengeError implements ErrorBase {
CHALLENGE_NOT_FOUND(HttpStatus.NOT_FOUND, "๋ฐ์ด์ฑŒ๋ฆฐ์ง€ ์ฐพ๊ธฐ ๋ถˆ๊ฐ€"),
;

private final HttpStatus status;
private final String errorMessage;

@Override
public int getHttpStatusCode() {
return status.value();
}

@Override
public HttpStatus getHttpStatus() {
return this.status;
}

@Override
public String getErrorMessage() {
return this.errorMessage;
}
}
Loading

0 comments on commit c95c09d

Please sign in to comment.