Skip to content
This repository was archived by the owner on Dec 19, 2022. It is now read-only.

Commit 0e91739

Browse files
authored
Merge pull request #2 from ScriptQL/feat/abstract
Feat/abstract
2 parents 550570b + 7109b53 commit 0e91739

17 files changed

+291
-73
lines changed

build.gradle

+2
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ repositories {
2121
dependencies {
2222
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
2323
implementation 'org.springframework.boot:spring-boot-starter-web'
24+
implementation 'org.hibernate:hibernate-validator:7.0.4.Final'
25+
implementation 'org.springframework.boot:spring-boot-starter-security'
2426
compileOnly 'org.projectlombok:lombok'
2527
runtimeOnly 'org.postgresql:postgresql'
2628
annotationProcessor 'org.projectlombok:lombok'
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package com.scriptql.scriptqlapi.controllers;
2+
3+
import com.scriptql.scriptqlapi.services.AbstractService;
4+
import com.scriptql.scriptqlapi.entities.IEntity;
5+
import lombok.RequiredArgsConstructor;
6+
import org.springframework.web.bind.annotation.*;
7+
8+
import javax.validation.Valid;
9+
import java.util.List;
10+
11+
@RestController
12+
@RequiredArgsConstructor
13+
public abstract class AbstractController<T extends IEntity> {
14+
15+
protected final AbstractService<T> service;
16+
17+
@GetMapping()
18+
public List<T> list() {
19+
return service.findAll();
20+
}
21+
22+
@GetMapping("/{id:[0-9]+}")
23+
public T list(@PathVariable("id") long id) {
24+
return service.findOne(id);
25+
}
26+
27+
@PostMapping()
28+
public T create(@Valid @RequestBody T request) {
29+
return service.create(request);
30+
}
31+
32+
@PatchMapping()
33+
public T update(@Valid @RequestBody T request) {
34+
return service.update(request);
35+
}
36+
37+
@DeleteMapping("/{id:[0-9]+}")
38+
public void delete(@Valid @PathVariable("id") long id) {
39+
service.delete(id);
40+
}
41+
42+
}
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,16 @@
11
package com.scriptql.scriptqlapi.controllers;
22

33
import com.scriptql.scriptqlapi.entities.DatabaseConnection;
4-
import com.scriptql.scriptqlapi.repositories.DatabaseConnectionRepository;
54
import com.scriptql.scriptqlapi.services.ConnectionManagerService;
6-
import org.springframework.web.bind.annotation.*;
7-
8-
import java.util.List;
5+
import org.springframework.web.bind.annotation.RequestMapping;
6+
import org.springframework.web.bind.annotation.RestController;
97

108
@RestController
119
@RequestMapping("/connection_manager")
12-
public class ConnectionManagerController {
13-
private final DatabaseConnectionRepository repository;
14-
private final ConnectionManagerService service;
15-
16-
public ConnectionManagerController(DatabaseConnectionRepository repository, ConnectionManagerService service) {
17-
this.repository = repository;
18-
this.service = service;
19-
}
20-
21-
@GetMapping()
22-
public List<DatabaseConnection> list() {
23-
return repository.findAll();
24-
}
25-
26-
@PostMapping()
27-
public DatabaseConnection create(@RequestBody DatabaseConnection request) {
28-
return service.create(request);
29-
}
10+
public class ConnectionManagerController extends AbstractController<DatabaseConnection> {
3011

31-
@PatchMapping()
32-
public DatabaseConnection update(@RequestBody DatabaseConnection request) {
33-
return service.update(request);
12+
public ConnectionManagerController(ConnectionManagerService service) {
13+
super(service);
3414
}
3515

36-
@DeleteMapping("/{id:[0-9]+}")
37-
public DatabaseConnection delete(@PathVariable("id") long id) {
38-
return service.delete(id);
39-
}
4016
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package com.scriptql.scriptqlapi.controllers;
2+
3+
import com.scriptql.scriptqlapi.entities.Query;
4+
import com.scriptql.scriptqlapi.services.QueryService;
5+
import org.springframework.web.bind.annotation.DeleteMapping;
6+
import org.springframework.web.bind.annotation.PathVariable;
7+
import org.springframework.web.bind.annotation.RequestMapping;
8+
import org.springframework.web.bind.annotation.RestController;
9+
10+
import javax.validation.Valid;
11+
12+
@RestController
13+
@RequestMapping("/query")
14+
public class QuerryController extends AbstractController<Query> {
15+
16+
public QuerryController(QueryService service) {
17+
super(service);
18+
}
19+
20+
@Override
21+
@DeleteMapping("/{id:[0-9]+}")
22+
public void delete(@Valid @PathVariable("id") long id) {
23+
throw new UnsupportedOperationException();
24+
}
25+
26+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package com.scriptql.scriptqlapi.controllers;
2+
3+
import com.scriptql.scriptqlapi.services.UserService;
4+
import com.scriptql.scriptqlapi.entities.User;
5+
import org.springframework.web.bind.annotation.RequestMapping;
6+
import org.springframework.web.bind.annotation.RestController;
7+
8+
@RestController
9+
@RequestMapping("/user")
10+
public class UserController extends AbstractController<User> {
11+
12+
public UserController(UserService service) {
13+
super(service);
14+
}
15+
16+
}

src/main/java/com/scriptql/scriptqlapi/entities/DatabaseConnection.java

+6-3
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,19 @@
66
import javax.persistence.*;
77

88
@Data
9-
@Table(name = "database_connection")
109
@Entity
11-
public class DatabaseConnection {
10+
@Table(name = "database_connections")
11+
public class DatabaseConnection implements IEntity {
12+
1213
@Id
1314
private long id;
1415
private String host;
1516
private String database;
1617
private String username;
1718
private String password;
19+
private int port;
20+
1821
@Enumerated(EnumType.STRING)
1922
private DatabaseDriver driver;
20-
private int port;
23+
2124
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package com.scriptql.scriptqlapi.entities;
2+
3+
public interface IEntity {
4+
5+
long getId();
6+
7+
void setId(long id);
8+
9+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package com.scriptql.scriptqlapi.entities;
2+
3+
import lombok.Data;
4+
5+
import javax.persistence.*;
6+
import javax.validation.constraints.NotEmpty;
7+
import java.time.LocalDateTime;
8+
import java.util.List;
9+
10+
@Data
11+
@Entity
12+
@Table(name = "querys")
13+
public class Query implements IEntity {
14+
15+
@Id
16+
private long id;
17+
18+
@NotEmpty
19+
private String query;
20+
21+
@NotEmpty
22+
@ManyToOne
23+
private User createdBy;
24+
25+
@NotEmpty
26+
@ManyToMany
27+
private List<DatabaseConnection> connections;
28+
29+
private LocalDateTime executionDate;
30+
31+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package com.scriptql.scriptqlapi.entities;
2+
3+
import lombok.Data;
4+
5+
import javax.persistence.Entity;
6+
import javax.persistence.Id;
7+
import javax.persistence.Table;
8+
import javax.validation.constraints.NotEmpty;
9+
10+
@Data
11+
@Entity
12+
@Table(name = "users")
13+
public class User implements IEntity {
14+
15+
@Id
16+
private long id;
17+
18+
@NotEmpty
19+
private String login;
20+
21+
@NotEmpty
22+
private String name;
23+
24+
@NotEmpty
25+
private String password;
26+
private String salt;
27+
28+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package com.scriptql.scriptqlapi.repositories;
2+
3+
import org.springframework.data.jpa.repository.JpaRepository;
4+
5+
public interface AbstractRepository<T> extends JpaRepository<T, Long> {
6+
}
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
package com.scriptql.scriptqlapi.repositories;
22

3-
43
import com.scriptql.scriptqlapi.entities.DatabaseConnection;
5-
import org.springframework.data.jpa.repository.JpaRepository;
64

7-
public interface DatabaseConnectionRepository extends JpaRepository<DatabaseConnection, Long> {
5+
public interface DatabaseConnectionRepository extends AbstractRepository<DatabaseConnection> {
86
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package com.scriptql.scriptqlapi.repositories;
2+
3+
import com.scriptql.scriptqlapi.entities.Query;
4+
5+
public interface QueryRepository extends AbstractRepository<Query> {
6+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package com.scriptql.scriptqlapi.repositories;
2+
3+
import com.scriptql.scriptqlapi.entities.User;
4+
5+
import java.util.Optional;
6+
7+
public interface UserRepository extends AbstractRepository<User> {
8+
9+
Optional<User> findFirstByLoginAndPassword(String login, String password);
10+
11+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package com.scriptql.scriptqlapi.services;
2+
3+
import com.scriptql.scriptqlapi.entities.IEntity;
4+
import com.scriptql.scriptqlapi.repositories.AbstractRepository;
5+
import com.scriptql.scriptqlapi.utils.Snowflake;
6+
import lombok.RequiredArgsConstructor;
7+
import org.springframework.stereotype.Service;
8+
9+
import java.util.List;
10+
11+
@Service
12+
@RequiredArgsConstructor
13+
public abstract class AbstractService<T extends IEntity> {
14+
15+
protected final AbstractRepository<T> repository;
16+
protected final Snowflake snowflake;
17+
18+
public T create(T entity) {
19+
entity.setId(snowflake.next());
20+
this.validate(entity);
21+
return repository.save(entity);
22+
}
23+
24+
public T update(T entity) {
25+
if (repository.existsById(entity.getId())) {
26+
throw new IllegalArgumentException("Database Connection not found");
27+
}
28+
this.validate(entity);
29+
return repository.save(entity);
30+
}
31+
32+
public T findOne(long id) {
33+
return this.repository.findById(id).orElseThrow();
34+
}
35+
36+
public List<T> findAll() {
37+
return this.repository.findAll();
38+
}
39+
40+
public void delete(long id) {
41+
T entity = repository.findById(id)
42+
.orElseThrow(() -> new IllegalArgumentException("Entity not found"));
43+
44+
repository.delete(entity);
45+
}
46+
47+
protected void validate(T entity) {
48+
}
49+
50+
}

src/main/java/com/scriptql/scriptqlapi/services/ConnectionManagerService.java

+2-38
Original file line numberDiff line numberDiff line change
@@ -6,46 +6,10 @@
66
import org.springframework.stereotype.Service;
77

88
@Service
9-
public class ConnectionManagerService {
10-
private final DatabaseConnectionRepository repository;
11-
private final Snowflake snowflake;
9+
public class ConnectionManagerService extends AbstractService<DatabaseConnection> {
1210

1311
public ConnectionManagerService(DatabaseConnectionRepository repository, Snowflake snowflake) {
14-
this.repository = repository;
15-
this.snowflake = snowflake;
12+
super(repository, snowflake);
1613
}
1714

18-
public DatabaseConnection create(DatabaseConnection databaseConnection) {
19-
if (databaseConnection.getDatabase() == null || databaseConnection.getDatabase().isBlank()) {
20-
throw new IllegalArgumentException("Invalid database name");
21-
} else if (databaseConnection.getHost() == null || databaseConnection.getHost().isBlank()) {
22-
throw new IllegalArgumentException("Invalid host name");
23-
} else if (databaseConnection.getPassword() == null || databaseConnection.getPassword().isBlank()) {
24-
throw new IllegalArgumentException("Invalid password");
25-
} else if (databaseConnection.getPort() < 0 || databaseConnection.getPort() > 65_534) {
26-
throw new IllegalArgumentException("Port must be valid");
27-
} else if (databaseConnection.getDriver() == null) {
28-
throw new IllegalArgumentException("Invalid driver");
29-
}
30-
31-
databaseConnection.setId(snowflake.next());
32-
return repository.save(databaseConnection);
33-
}
34-
35-
public DatabaseConnection update(DatabaseConnection request) {
36-
if (repository.findById(request.getId()).isPresent()) {
37-
return repository.save(request);
38-
}
39-
40-
throw new IllegalArgumentException("Database Connection not found");
41-
}
42-
43-
public DatabaseConnection delete(long id) {
44-
DatabaseConnection conn = repository.findById(id)
45-
.orElseThrow(() -> new IllegalArgumentException("Database Connection not found"));
46-
47-
repository.delete(conn);
48-
49-
return conn;
50-
}
5115
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package com.scriptql.scriptqlapi.services;
2+
3+
import com.scriptql.scriptqlapi.entities.Query;
4+
import com.scriptql.scriptqlapi.repositories.QueryRepository;
5+
import com.scriptql.scriptqlapi.utils.Snowflake;
6+
import org.springframework.stereotype.Service;
7+
8+
import java.time.LocalDateTime;
9+
import java.util.Objects;
10+
11+
@Service
12+
public class QueryService extends AbstractService<Query> {
13+
14+
public QueryService(QueryRepository repository, Snowflake snowflake) {
15+
super(repository, snowflake);
16+
}
17+
18+
@Override
19+
public void validate(Query query) {
20+
if (Objects.nonNull(query.getExecutionDate())) {
21+
throw new IllegalArgumentException("Nao se pode manipular Querys ja executadas");
22+
}
23+
}
24+
25+
}

0 commit comments

Comments
 (0)