From bdfd8a91421514db59a87a2af8f1f062416cbda9 Mon Sep 17 00:00:00 2001 From: luxic Date: Sun, 17 Aug 2025 09:12:15 +0700 Subject: [PATCH] simple paste create api --- pom.xml | 13 ++++- .../pastebin/controller/PasteController.java | 33 ++++++++++++ .../id/my/luxic/pastebin/model/Paste.java | 29 +++++++++++ .../pastebin/repository/PasteRepository.java | 7 +++ .../pastebin/request/PasteCreateRequest.java | 47 +++++++++++++++++ .../luxic/pastebin/service/PasteService.java | 18 +++++++ .../service/impl/PasteServiceImpl.java | 51 +++++++++++++++++++ src/main/resources/application.properties | 6 +++ 8 files changed, 203 insertions(+), 1 deletion(-) create mode 100644 src/main/java/id/my/luxic/pastebin/controller/PasteController.java create mode 100644 src/main/java/id/my/luxic/pastebin/model/Paste.java create mode 100644 src/main/java/id/my/luxic/pastebin/repository/PasteRepository.java create mode 100644 src/main/java/id/my/luxic/pastebin/request/PasteCreateRequest.java create mode 100644 src/main/java/id/my/luxic/pastebin/service/PasteService.java create mode 100644 src/main/java/id/my/luxic/pastebin/service/impl/PasteServiceImpl.java diff --git a/pom.xml b/pom.xml index 263e454..92bbfa3 100644 --- a/pom.xml +++ b/pom.xml @@ -42,7 +42,6 @@ org.springframework.boot spring-boot-starter-web - org.projectlombok lombok @@ -53,6 +52,18 @@ spring-boot-starter-test test + + org.postgresql + postgresql + 42.7.7 + runtime + + + + org.apache.commons + commons-lang3 + 3.18.0 + diff --git a/src/main/java/id/my/luxic/pastebin/controller/PasteController.java b/src/main/java/id/my/luxic/pastebin/controller/PasteController.java new file mode 100644 index 0000000..eff3f51 --- /dev/null +++ b/src/main/java/id/my/luxic/pastebin/controller/PasteController.java @@ -0,0 +1,33 @@ +package id.my.luxic.pastebin.controller; + +import id.my.luxic.pastebin.model.Paste; +import id.my.luxic.pastebin.request.PasteCreateRequest; +import id.my.luxic.pastebin.service.PasteService; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@RestController +public class PasteController { + + private final PasteService service; + + public PasteController(PasteService service) { + this.service = service; + } + + @GetMapping("/api/paste/findAll") + public ResponseEntity> findAll() { + return ResponseEntity.ok(service.findAll()); + } + + @PostMapping("/api/paste/create") + public ResponseEntity create(@RequestBody PasteCreateRequest pasteCreateRequest) { + return ResponseEntity.ok(service.save(pasteCreateRequest)); + } + +} diff --git a/src/main/java/id/my/luxic/pastebin/model/Paste.java b/src/main/java/id/my/luxic/pastebin/model/Paste.java new file mode 100644 index 0000000..be63956 --- /dev/null +++ b/src/main/java/id/my/luxic/pastebin/model/Paste.java @@ -0,0 +1,29 @@ +package id.my.luxic.pastebin.model; + +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import lombok.*; + +import java.time.LocalDateTime; + +@Entity +@Getter +@Setter +@Builder +@AllArgsConstructor +@NoArgsConstructor +@Table(name = "paste") +public class Paste { + + @Id + private String id; + private String content; + private String title; + private LocalDateTime expireAt; + private LocalDateTime created; + private LocalDateTime updated; + private Boolean isPrivate; + private Boolean isDeleted; + +} diff --git a/src/main/java/id/my/luxic/pastebin/repository/PasteRepository.java b/src/main/java/id/my/luxic/pastebin/repository/PasteRepository.java new file mode 100644 index 0000000..17de0c1 --- /dev/null +++ b/src/main/java/id/my/luxic/pastebin/repository/PasteRepository.java @@ -0,0 +1,7 @@ +package id.my.luxic.pastebin.repository; + +import id.my.luxic.pastebin.model.Paste; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface PasteRepository extends JpaRepository { +} diff --git a/src/main/java/id/my/luxic/pastebin/request/PasteCreateRequest.java b/src/main/java/id/my/luxic/pastebin/request/PasteCreateRequest.java new file mode 100644 index 0000000..47e52a8 --- /dev/null +++ b/src/main/java/id/my/luxic/pastebin/request/PasteCreateRequest.java @@ -0,0 +1,47 @@ +package id.my.luxic.pastebin.request; + +import lombok.Getter; +import lombok.Setter; + +import java.sql.Timestamp; +import java.time.LocalDateTime; + +@Getter +@Setter +public class PasteCreateRequest { + + private String content; + private String title; + private Boolean isPrivate; + private Expiration expiration; + + public enum Expiration { + NEVER { + @Override + public LocalDateTime getTimestamp() { + return null; + } + }, + ONE_HOUR { + @Override + public LocalDateTime getTimestamp() { + return LocalDateTime.now().plusHours(1); + } + }, + ONE_DAY { + @Override + public LocalDateTime getTimestamp() { + return LocalDateTime.now().plusDays(1); + } + }, + ONE_WEEK { + @Override + public LocalDateTime getTimestamp() { + return LocalDateTime.now().plusWeeks(1); + } + }; + + public abstract LocalDateTime getTimestamp(); + } + +} diff --git a/src/main/java/id/my/luxic/pastebin/service/PasteService.java b/src/main/java/id/my/luxic/pastebin/service/PasteService.java new file mode 100644 index 0000000..7dbed42 --- /dev/null +++ b/src/main/java/id/my/luxic/pastebin/service/PasteService.java @@ -0,0 +1,18 @@ +package id.my.luxic.pastebin.service; + +import id.my.luxic.pastebin.model.Paste; +import id.my.luxic.pastebin.request.PasteCreateRequest; + +import java.util.List; + +public interface PasteService { + + Paste findById(String id); + + List findAll(); + + Paste save(PasteCreateRequest pasteCreateRequest); + + void delete(String id); + +} diff --git a/src/main/java/id/my/luxic/pastebin/service/impl/PasteServiceImpl.java b/src/main/java/id/my/luxic/pastebin/service/impl/PasteServiceImpl.java new file mode 100644 index 0000000..06893ba --- /dev/null +++ b/src/main/java/id/my/luxic/pastebin/service/impl/PasteServiceImpl.java @@ -0,0 +1,51 @@ +package id.my.luxic.pastebin.service.impl; + +import id.my.luxic.pastebin.model.Paste; +import id.my.luxic.pastebin.repository.PasteRepository; +import id.my.luxic.pastebin.request.PasteCreateRequest; +import id.my.luxic.pastebin.service.PasteService; +import org.apache.commons.lang3.RandomStringUtils; +import org.springframework.stereotype.Service; + +import java.time.LocalDateTime; +import java.util.List; + +@Service +public class PasteServiceImpl implements PasteService { + + private final PasteRepository repository; + + public PasteServiceImpl(PasteRepository repository) { + this.repository = repository; + } + + @Override + public Paste findById(String id) { + return repository.findById(id).orElse(null); + } + + @Override + public List findAll() { + return repository.findAll(); + } + + @Override + public Paste save(PasteCreateRequest pasteCreateRequest) { + + Paste paste = Paste.builder() + .id(RandomStringUtils.secure().nextAlphanumeric(10)) + .title(pasteCreateRequest.getTitle()) + .content(pasteCreateRequest.getContent()) + .isPrivate(pasteCreateRequest.getIsPrivate()) + .expireAt(pasteCreateRequest.getExpiration().getTimestamp()) + .created(LocalDateTime.now()) + .build(); + + return repository.save(paste); + } + + @Override + public void delete(String id) { + repository.deleteById(id); + } +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index bc48692..d11cc43 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1 +1,7 @@ spring.application.name=pastebin + +spring.datasource.url=jdbc:postgresql://localhost:5432/pastebin +spring.datasource.username=postgres +spring.datasource.password=password + +spring.jpa.hibernate.ddl-auto=update \ No newline at end of file