Skip to content

Commit

Permalink
Merge pull request #87 from Team-MindWay/83-event-write-api
Browse files Browse the repository at this point in the history
🔀 :: 이벤트 작성 api
  • Loading branch information
Umjiseung authored Apr 18, 2024
2 parents 6685db8 + 4ea0d26 commit e7c433f
Show file tree
Hide file tree
Showing 14 changed files with 252 additions and 2 deletions.
3 changes: 3 additions & 0 deletions build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,9 @@ dependencies {
//redis
implementation ("org.springframework.boot:spring-boot-starter-data-redis:2.3.1.RELEASE")

// aws
implementation("org.springframework.cloud:spring-cloud-starter-aws:2.2.6.RELEASE")

implementation("org.springframework.boot:spring-boot-starter-web")
implementation("org.springframework.boot:spring-boot-starter-validation:3.2.0")
compileOnly("org.projectlombok:lombok")
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.mindway.server.v2.domain.event.converter;

import com.mindway.server.v2.domain.event.entity.Event;
import com.mindway.server.v2.domain.event.presentation.dto.request.EventWriteRequestDto;
import com.mindway.server.v2.domain.user.entity.User;

public interface EventConverter {
Event toEntity(EventWriteRequestDto eventWriteRequestDto, User user, String image_url);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package com.mindway.server.v2.domain.event.converter.impl;

import com.mindway.server.v2.domain.event.converter.EventConverter;
import com.mindway.server.v2.domain.event.entity.Event;
import com.mindway.server.v2.domain.event.presentation.dto.request.EventWriteRequestDto;
import com.mindway.server.v2.domain.user.entity.User;
import org.springframework.stereotype.Component;

import java.time.LocalDate;

@Component
public class EventConverterImpl implements EventConverter {
public Event toEntity(EventWriteRequestDto eventWriteRequestDto, User user, String image_url) {
return Event.builder()
.title(eventWriteRequestDto.getTitle())
.content(eventWriteRequestDto.getContent())
.started_at(LocalDate.parse(eventWriteRequestDto.getCreated_at()))
.ended_at(LocalDate.parse(eventWriteRequestDto.getEnded_at()))
.img_url(image_url)
.user(user)
.build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package com.mindway.server.v2.domain.event.presentation;

import com.mindway.server.v2.domain.event.presentation.dto.request.EventWriteRequestDto;
import com.mindway.server.v2.domain.event.service.EventWriteService;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

@RestController
@RequiredArgsConstructor
@RequestMapping("/api/v2/event")
public class EventController {

private final EventWriteService eventWriteService;

@PostMapping
public ResponseEntity<Void> writeEvent(
@Valid @RequestPart("dto") EventWriteRequestDto eventWriteRequestDto,
@RequestPart(required = false) MultipartFile image
) {
eventWriteService.execute(eventWriteRequestDto, image);
return ResponseEntity.status(HttpStatus.CREATED).build();
}



}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package com.mindway.server.v2.domain.event.presentation.dto.request;

import jakarta.validation.constraints.NotNull;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.springframework.web.multipart.MultipartFile;

import java.time.LocalDate;

@Getter
@NoArgsConstructor
public class EventWriteRequestDto {
@NotNull
private String title;
@NotNull
private String content;
@NotNull
private String created_at;
@NotNull
private String ended_at;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.mindway.server.v2.domain.event.repository;

import com.mindway.server.v2.domain.event.entity.Event;
import org.springframework.data.jpa.repository.JpaRepository;

public interface EventRepository extends JpaRepository<Event, Long> {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.mindway.server.v2.domain.event.service;

import com.mindway.server.v2.domain.event.presentation.dto.request.EventWriteRequestDto;
import org.springframework.web.multipart.MultipartFile;


public interface EventWriteService {
void execute(EventWriteRequestDto eventWriteRequestDto, MultipartFile image);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package com.mindway.server.v2.domain.event.service.impl;

import com.mindway.server.v2.domain.event.converter.EventConverter;
import com.mindway.server.v2.domain.event.entity.Event;
import com.mindway.server.v2.domain.event.presentation.dto.request.EventWriteRequestDto;
import com.mindway.server.v2.domain.event.repository.EventRepository;
import com.mindway.server.v2.domain.event.service.EventWriteService;
import com.mindway.server.v2.domain.notice.exception.NotAccessStudentException;
import com.mindway.server.v2.domain.user.entity.Authority;
import com.mindway.server.v2.domain.user.entity.User;
import com.mindway.server.v2.domain.user.util.UserUtil;
import com.mindway.server.v2.global.annotation.ServiceWithTransaction;
import com.mindway.server.v2.global.thirdparty.aws.S3Util;
import lombok.RequiredArgsConstructor;
import org.springframework.web.multipart.MultipartFile;

@ServiceWithTransaction
@RequiredArgsConstructor
public class EventWriteServiceImpl implements EventWriteService {

private final EventRepository eventRepository;
private final S3Util s3Util;
private final UserUtil userUtil;
private final EventConverter eventConverter;

public void execute(EventWriteRequestDto eventWriteRequestDto, MultipartFile image) {
User user = userUtil.getCurrentUser();

if (user.getAuthority() == Authority.ROLE_STUDENT)
throw new NotAccessStudentException();

String image_url = s3Util.imageUpload(image);

Event event = eventConverter.toEntity(eventWriteRequestDto, user, image_url);

eventRepository.save(event);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,10 @@ public enum ErrorCode {

/* book */
NOT_FOUND_BOOK(404, "등록된 독후감을 찾을 수 없습니다."),
NOT_SAME_AUTHOR(403, "작성자가 아닙니다.");
NOT_SAME_AUTHOR(403, "작성자가 아닙니다."),

/* image */
FILE_EXTENSION_INVALID(400, "파일 확장자가 유효하지 않습니다.");

private final int status;
private final String message;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,9 @@ public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
.requestMatchers(HttpMethod.POST, "/api/v2/notice").hasAnyAuthority(Authority.ROLE_TEACHER.name(), Authority.ROLE_HELPER.name())
.requestMatchers(HttpMethod.GET, "/api/v2/notice").authenticated()

// event
.requestMatchers(HttpMethod.POST, "/api/v2/event").hasAnyAuthority(Authority.ROLE_TEACHER.name(), Authority.ROLE_HELPER.name())


.anyRequest().authenticated()
)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package com.mindway.server.v2.global.thirdparty.aws;

import com.amazonaws.auth.AWSStaticCredentialsProvider;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class S3Config {
@Value("${cloud.aws.credentials.access-key}")
private String accessKey;

@Value("${cloud.aws.credentials.secret-key}")
private String secretKey;

@Value("${cloud.aws.region.static}")
private String region;

@Bean
public AmazonS3 amazonS3() {
BasicAWSCredentials awsCredentials = new BasicAWSCredentials(accessKey, secretKey);
return AmazonS3ClientBuilder.standard()
.withRegion(region)
.withCredentials(new AWSStaticCredentialsProvider(awsCredentials))
.build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
package com.mindway.server.v2.global.thirdparty.aws;

import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.model.ObjectMetadata;
import com.mindway.server.v2.global.exception.ErrorCode;
import com.mindway.server.v2.global.exception.MindWayException;
import com.mindway.server.v2.global.thirdparty.aws.exception.FileExtensionInvalidException;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.List;
import java.util.UUID;

@Component
@RequiredArgsConstructor
public class S3Util {
@Value("${cloud.aws.s3.bucket}")
private String bucket;

private final AmazonS3 amazonS3;

public String imageUpload(MultipartFile image) {
try {
List<String> list = List.of("jpg", "jpeg", "png");

String[] splitFile = image.getOriginalFilename().split("\\.");

if (splitFile.length < 2)
throw new FileExtensionInvalidException();

String extension = splitFile[1].toLowerCase();

if (list.stream().noneMatch(it -> it.equals(extension)))
throw new FileExtensionInvalidException();

return upload(image);
} catch (IOException e) {
throw new RuntimeException(e);
}
}

private String upload(MultipartFile file) throws IOException {
String profileName = bucket + "/" + UUID.randomUUID() + file.getOriginalFilename();
ObjectMetadata metadata = new ObjectMetadata();
metadata.setContentLength(file.getInputStream().available());
amazonS3.putObject(bucket, profileName, file.getInputStream(), metadata);
return amazonS3.getUrl(bucket, profileName).toString();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.mindway.server.v2.global.thirdparty.aws.exception;

import com.mindway.server.v2.global.exception.ErrorCode;
import com.mindway.server.v2.global.exception.MindWayException;

public class FileExtensionInvalidException extends MindWayException {
public FileExtensionInvalidException() {
super(ErrorCode.FILE_EXTENSION_INVALID);
}
}
14 changes: 13 additions & 1 deletion src/main/resources/application.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,4 +24,16 @@ jwt:
gauth:
clientId: ${GAUTH_CLIENT}
clientSecret: ${GAUTH_SECRET}
redirectUri: ${GAUTH_REDIRECT_URI}
redirectUri: ${GAUTH_REDIRECT_URI}

cloud:
aws:
credentials:
access-key: ${AWS_ACCESS_KEY}
secret-key: ${AWS_SECRET_KEY}
region:
static: ${AWS_STATIC}
s3:
bucket: ${AWS_S3_BUCKET}
stack:
auto: false

0 comments on commit e7c433f

Please sign in to comment.