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,40 @@
package com.ajouchong.controller.admin;

import com.ajouchong.common.ApiResponse;
import com.ajouchong.dto.request.LinkRequestDto;
import com.ajouchong.dto.response.LinkResponseDto;
import com.ajouchong.service.LinkService;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;

import jakarta.validation.Valid;
import java.util.List;

@RestController
@RequestMapping("/api/admin/link")
@RequiredArgsConstructor
public class LinkAdminController {

private final LinkService linkService;

@PostMapping("/upload")
public ApiResponse<LinkResponseDto> uploadLink(@Valid @RequestBody LinkRequestDto requestDto) {
LinkResponseDto response = linkService.uploadLink(requestDto);

return new ApiResponse<>(1, "링크가 성공적으로 업로드되었습니다.", response);
}

@GetMapping
public ApiResponse<List<LinkResponseDto>> getAllLinks() {
List<LinkResponseDto> links = linkService.getAllLinks();

return new ApiResponse<>(1, "링크 목록을 조회했습니다.", links);
}

@DeleteMapping("/{id}/delete")
public ApiResponse<Void> deleteLink(@PathVariable Long id) {
linkService.deleteLink(id);

return new ApiResponse<>(1, "링크가 삭제되었습니다.", null);
}
}
39 changes: 39 additions & 0 deletions src/main/java/com/ajouchong/controller/user/LinkController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package com.ajouchong.controller.user;

import com.ajouchong.common.ApiResponse;
import com.ajouchong.dto.request.LinkRequestDto;
import com.ajouchong.dto.response.LinkResponseDto;
import com.ajouchong.service.LinkService;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;

import jakarta.validation.Valid;
import java.util.List;

@RestController
@RequestMapping("/api/link")
@RequiredArgsConstructor
public class LinkController {
private final LinkService linkService;

@PostMapping("/upload")
public ApiResponse<LinkResponseDto> uploadLink(@Valid @RequestBody LinkRequestDto requestDto) {
LinkResponseDto response = linkService.uploadLink(requestDto);

return new ApiResponse<>(1, "링크가 성공적으로 업로드되었습니다.", response);
}

@GetMapping
public ApiResponse<List<LinkResponseDto>> getAllLinks() {
List<LinkResponseDto> links = linkService.getAllLinks();

return new ApiResponse<>(1, "링크 목록을 조회했습니다.", links);
}

@DeleteMapping("/{id}/delete")
public ApiResponse<Void> deleteLink(@PathVariable Long id) {
linkService.deleteLink(id);

return new ApiResponse<>(1, "링크가 삭제되었습니다.", null);
}
}
15 changes: 15 additions & 0 deletions src/main/java/com/ajouchong/dto/request/LinkRequestDto.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.ajouchong.dto.request;

import lombok.Data;

import jakarta.validation.constraints.NotBlank;

@Data
public class LinkRequestDto {

@NotBlank(message = "제목은 필수입니다.")
private String title;

@NotBlank(message = "링크는 필수입니다.")
private String link;
}
15 changes: 15 additions & 0 deletions src/main/java/com/ajouchong/dto/response/LinkResponseDto.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.ajouchong.dto.response;

import lombok.Data;
import lombok.Builder;

import java.time.LocalDateTime;

@Data
@Builder
public class LinkResponseDto {
private Long id;
private String title;
private String link;
private LocalDateTime createdAt;
}
37 changes: 37 additions & 0 deletions src/main/java/com/ajouchong/entity/Link.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package com.ajouchong.entity;

import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import jakarta.persistence.PrePersist;
import java.time.LocalDateTime;

@Entity
@Table(name = "links")
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Link {

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

@Column(nullable = false)
private String title;

@Column(nullable = false)
private String link;

@Column(name = "created_at", nullable = false, updatable = false)
private LocalDateTime createdAt;

@PrePersist
protected void onCreate() {
createdAt = LocalDateTime.now();
}
}
13 changes: 13 additions & 0 deletions src/main/java/com/ajouchong/repository/LinkRepository.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.ajouchong.repository;

import com.ajouchong.entity.Link;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
public interface LinkRepository extends JpaRepository<Link, Long> {

List<Link> findAllByOrderByCreatedAtAsc();
}
58 changes: 58 additions & 0 deletions src/main/java/com/ajouchong/service/LinkService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
package com.ajouchong.service;

import com.ajouchong.dto.request.LinkRequestDto;
import com.ajouchong.dto.response.LinkResponseDto;
import com.ajouchong.entity.Link;
import com.ajouchong.repository.LinkRepository;
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(readOnly = true)
public class LinkService {

private final LinkRepository linkRepository;

@Transactional
public LinkResponseDto uploadLink(LinkRequestDto requestDto) {
Link link = Link.builder()
.title(requestDto.getTitle())
.link(requestDto.getLink())
.build();

Link savedLink = linkRepository.save(link);

return LinkResponseDto.builder()
.id(savedLink.getId())
.title(savedLink.getTitle())
.link(savedLink.getLink())
.createdAt(savedLink.getCreatedAt())
.build();
}

public List<LinkResponseDto> getAllLinks() {
List<Link> links = linkRepository.findAllByOrderByCreatedAtAsc();

return links.stream()
.map(link -> LinkResponseDto.builder()
.id(link.getId())
.title(link.getTitle())
.link(link.getLink())
.createdAt(link.getCreatedAt())
.build())
.collect(Collectors.toList());
}

@Transactional
public void deleteLink(Long id) {
Link link = linkRepository.findById(id)
.orElseThrow(() -> new IllegalArgumentException("링크를 찾을 수 없습니다. ID: " + id));

linkRepository.delete(link);
}
}
Loading