diff --git a/Jenkinsfile b/Jenkinsfile new file mode 100644 index 0000000..ad6eea9 --- /dev/null +++ b/Jenkinsfile @@ -0,0 +1,11 @@ +pipeline { + agent any + stages { + stage('Build') { + steps { + sh 'mvn -B -DskipTests clean package' + } + } + } +} + diff --git a/src/main/java/id/my/luxic/pastebin/config/DatasourceConfig.java b/src/main/java/id/my/luxic/pastebin/config/DatasourceConfig.java new file mode 100644 index 0000000..f422da0 --- /dev/null +++ b/src/main/java/id/my/luxic/pastebin/config/DatasourceConfig.java @@ -0,0 +1,31 @@ +package id.my.luxic.pastebin.config; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.jdbc.DataSourceBuilder; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import javax.sql.DataSource; + +@Configuration +public class DatasourceConfig { + + @Value("${spring.datasource.url}") + private String url; + + @Value("${spring.datasource.username}") + private String username; + + @Value("${spring.datasource.password}") + private String password; + + @Bean + DataSource dataSource() { + DataSourceBuilder dataSourceBuilder = DataSourceBuilder.create(); + dataSourceBuilder.url(url); + dataSourceBuilder.username(username); + dataSourceBuilder.password(password); + return dataSourceBuilder.build(); + } + +} diff --git a/src/main/java/id/my/luxic/pastebin/controller/HomeController.java b/src/main/java/id/my/luxic/pastebin/controller/HomeController.java deleted file mode 100644 index ee179ec..0000000 --- a/src/main/java/id/my/luxic/pastebin/controller/HomeController.java +++ /dev/null @@ -1,32 +0,0 @@ -package id.my.luxic.pastebin.controller; - -import id.my.luxic.pastebin.model.Paste; -import id.my.luxic.pastebin.service.PasteService; -import org.springframework.stereotype.Controller; -import org.springframework.ui.Model; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; - -@Controller -public class HomeController { - - private final PasteService service; - - public HomeController(PasteService service) { - this.service = service; - } - - @GetMapping("/") - public String home(Model model) { - model.addAttribute("message", "Hello, Thymeleaf!"); - return "index"; - } - - @GetMapping("/paste/{id}") - public String paste(Model model, @PathVariable String id) { - Paste paste = service.findById(id); - model.addAttribute("paste", paste); - return "paste"; - } - -} diff --git a/src/main/java/id/my/luxic/pastebin/controller/PasteController.java b/src/main/java/id/my/luxic/pastebin/controller/PasteController.java index 54ff70a..0c4ddbf 100644 --- a/src/main/java/id/my/luxic/pastebin/controller/PasteController.java +++ b/src/main/java/id/my/luxic/pastebin/controller/PasteController.java @@ -1,5 +1,6 @@ package id.my.luxic.pastebin.controller; +import com.fasterxml.jackson.databind.ObjectMapper; import id.my.luxic.pastebin.model.Paste; import id.my.luxic.pastebin.request.PasteCreateRequest; import id.my.luxic.pastebin.service.PasteService; @@ -28,6 +29,11 @@ public class PasteController { return ResponseEntity.ok(service.save(pasteCreateRequest)); } + @PostMapping(value = "/createJdbc") + public ResponseEntity createJdbc(@RequestBody PasteCreateRequest pasteCreateRequest) { + return ResponseEntity.ok(service.saveJdbc(pasteCreateRequest)); + } + @GetMapping("/{id}") public ResponseEntity findById(@PathVariable String id) { return ResponseEntity.ok(service.findById(id)); diff --git a/src/main/java/id/my/luxic/pastebin/model/Paste.java b/src/main/java/id/my/luxic/pastebin/model/Paste.java index 3c8773f..f3bb199 100644 --- a/src/main/java/id/my/luxic/pastebin/model/Paste.java +++ b/src/main/java/id/my/luxic/pastebin/model/Paste.java @@ -6,8 +6,6 @@ import jakarta.persistence.Table; import lombok.*; import org.springframework.jdbc.core.RowMapper; -import java.sql.ResultSet; -import java.sql.SQLException; import java.time.LocalDateTime; @Entity @@ -30,19 +28,17 @@ public class Paste { private Boolean isDeleted; public static RowMapper rowMapper() { - return (rs, rn) -> { - return Paste.builder() - .id(rs.getString("id")) - .content(rs.getString("content")) - .title(rs.getString("title")) - .expireAt(rs.getTimestamp("expire_at") == null ? null : rs.getTimestamp("expire_at").toLocalDateTime()) - .created(rs.getTimestamp("created") == null ? null : rs.getTimestamp("created").toLocalDateTime()) - .isPrivate(rs.getBoolean("is_private")) - .title(rs.getString("title")) - .updated(rs.getTimestamp("updated") == null ? null : rs.getTimestamp("updated").toLocalDateTime()) - .isDeleted(rs.getBoolean("is_deleted")) - .build(); - }; + return (rs, rn) -> Paste.builder() + .id(rs.getString("id")) + .content(rs.getString("content")) + .title(rs.getString("title")) + .expireAt(rs.getTimestamp("expire_at") == null ? null : rs.getTimestamp("expire_at").toLocalDateTime()) + .created(rs.getTimestamp("created") == null ? null : rs.getTimestamp("created").toLocalDateTime()) + .isPrivate(rs.getBoolean("is_private")) + .title(rs.getString("title")) + .updated(rs.getTimestamp("updated") == null ? null : rs.getTimestamp("updated").toLocalDateTime()) + .isDeleted(rs.getBoolean("is_deleted")) + .build(); } } diff --git a/src/main/java/id/my/luxic/pastebin/repository/PasteRepository.java b/src/main/java/id/my/luxic/pastebin/repository/PasteRepository.java index 17de0c1..7bd475d 100644 --- a/src/main/java/id/my/luxic/pastebin/repository/PasteRepository.java +++ b/src/main/java/id/my/luxic/pastebin/repository/PasteRepository.java @@ -3,5 +3,9 @@ package id.my.luxic.pastebin.repository; import id.my.luxic.pastebin.model.Paste; import org.springframework.data.jpa.repository.JpaRepository; +import java.util.List; + public interface PasteRepository extends JpaRepository { + + public List findAllPasteByIsDeleted(Boolean isDeleted); } diff --git a/src/main/java/id/my/luxic/pastebin/service/PasteService.java b/src/main/java/id/my/luxic/pastebin/service/PasteService.java index 37ad5c7..a69cf5c 100644 --- a/src/main/java/id/my/luxic/pastebin/service/PasteService.java +++ b/src/main/java/id/my/luxic/pastebin/service/PasteService.java @@ -15,6 +15,8 @@ public interface PasteService { Paste save(PasteCreateRequest pasteCreateRequest); + Paste saveJdbc(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 index 4fb8cb0..bc84784 100644 --- a/src/main/java/id/my/luxic/pastebin/service/impl/PasteServiceImpl.java +++ b/src/main/java/id/my/luxic/pastebin/service/impl/PasteServiceImpl.java @@ -5,10 +5,13 @@ 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.RandomUtils; -import org.springframework.data.domain.Example; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Service; +import javax.sql.DataSource; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; import java.time.LocalDateTime; import java.util.List; import java.util.stream.Collector; @@ -22,10 +25,13 @@ public class PasteServiceImpl implements PasteService { private final PasteRepository repository; private final JdbcTemplate jdbcTemplate; + private final DataSource datasource; - public PasteServiceImpl(PasteRepository repository, JdbcTemplate jdbcTemplate) { + public PasteServiceImpl(PasteRepository repository, JdbcTemplate jdbcTemplate, DataSource datasource) { this.repository = repository; this.jdbcTemplate = jdbcTemplate; + this.datasource = datasource; + } private String generateId(int length) { @@ -55,7 +61,6 @@ public class PasteServiceImpl implements PasteService { @Override public List findAllPublic() { - // why did I use jdbc template ;-; String sql = "select * from paste where (is_deleted is null or is_deleted = false) and is_private = false order by created desc"; return jdbcTemplate.query(sql, Paste.rowMapper()); } @@ -75,6 +80,44 @@ public class PasteServiceImpl implements PasteService { return repository.save(paste); } + @Override + public Paste saveJdbc(PasteCreateRequest pasteCreateRequest) { + + String sql = "insert into paste (id, title, content, is_private, expire_at, created) values (?, ?, ?, ?, ?, ?)"; + Connection conn = null; + try { + conn = datasource.getConnection(); + PreparedStatement statement = conn.prepareStatement(sql); + + statement.setString(1, generateId(10)); + statement.setString(2, pasteCreateRequest.getTitle()); + statement.setString(3, pasteCreateRequest.getContent()); + statement.setBoolean(4, pasteCreateRequest.getIsPrivate()); + statement.setTimestamp(5, java.sql.Timestamp.valueOf(pasteCreateRequest.getExpiration().getTimestamp())); + statement.setTimestamp(6, java.sql.Timestamp.valueOf(LocalDateTime.now())); + statement.executeUpdate(); + + statement.close(); + } catch (SQLException e) { + try { + conn.rollback(); + } catch (SQLException ex) { + throw new RuntimeException(ex); + } + throw new RuntimeException(e); + } finally { + if (conn != null) { + try { + conn.close(); + } catch (SQLException e) { + throw new RuntimeException(e); + } + } + } + + return Paste.builder().build(); + } + @Override public void delete(String id) { repository.deleteById(id); diff --git a/src/main/resources/templates/fragments/header.html b/src/main/resources/templates/fragments/header.html deleted file mode 100644 index fec2f80..0000000 --- a/src/main/resources/templates/fragments/header.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - ... - - - - - \ No newline at end of file diff --git a/src/main/resources/templates/index.html b/src/main/resources/templates/index.html deleted file mode 100644 index 8f89181..0000000 --- a/src/main/resources/templates/index.html +++ /dev/null @@ -1,12 +0,0 @@ - - - - Thymeleaf Example - - - -
-

Welcome to Thymeleaf!

-

This is a message

- - \ No newline at end of file diff --git a/src/main/resources/templates/paste.html b/src/main/resources/templates/paste.html deleted file mode 100644 index e4a12e2..0000000 --- a/src/main/resources/templates/paste.html +++ /dev/null @@ -1,14 +0,0 @@ - - - - Thymeleaf Example - - - -
- -
-

Welcome to Thymeleaf!

- - - \ No newline at end of file