diff --git a/.gitignore b/.gitignore
deleted file mode 100644
index 549e00a..0000000
--- a/.gitignore
+++ /dev/null
@@ -1,33 +0,0 @@
-HELP.md
-target/
-!.mvn/wrapper/maven-wrapper.jar
-!**/src/main/**/target/
-!**/src/test/**/target/
-
-### STS ###
-.apt_generated
-.classpath
-.factorypath
-.project
-.settings
-.springBeans
-.sts4-cache
-
-### IntelliJ IDEA ###
-.idea
-*.iws
-*.iml
-*.ipr
-
-### NetBeans ###
-/nbproject/private/
-/nbbuild/
-/dist/
-/nbdist/
-/.nb-gradle/
-build/
-!**/src/main/**/build/
-!**/src/test/**/build/
-
-### VS Code ###
-.vscode/
diff --git a/pom.xml b/pom.xml
index 287f17b..014a09e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -30,6 +30,10 @@
21
+
+ org.springframework.boot
+ spring-boot-starter-validation
+
org.springframework.boot
spring-boot-starter-actuator
diff --git a/src/main/java/com/stktrk/app/AppApplication.java b/src/main/java/com/stktrk/app/AppApplication.java
index a30c64b..3265a3e 100644
--- a/src/main/java/com/stktrk/app/AppApplication.java
+++ b/src/main/java/com/stktrk/app/AppApplication.java
@@ -1,63 +1,18 @@
package com.stktrk.app;
-import com.arcadedb.gremlin.ArcadeGraph;
-
-import com.github.javafaker.Faker;
-import com.stktrk.app.configuration.GraphDbConfig;
-import com.stktrk.app.db.ConnectionPool;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
+import jakarta.annotation.Nullable;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.RestController;
-
-import java.util.Comparator;
-import java.util.List;
-import java.util.Random;
-import java.util.StringJoiner;
// https://stackoverflow.com/questions/51221777/failed-to-configure-a-datasource-url-attribute-is-not-specified-and-no-embedd
@SpringBootApplication(exclude = {FlywayAutoConfiguration.class})
-@RestController
+
public class AppApplication extends SpringBootServletInitializer {
- public static void main(String[] args) {
+ public static void main(@Nullable String[] args) {
SpringApplication.run(AppApplication.class, args);
}
-// klkljgh
- @GetMapping("/hello")
- public String sayHello(@RequestParam(value = "myName", defaultValue = "World") String name) {
-
-
- List x = List.of();
- ArcadeGraph g = ConnectionPool.getGraph();
- x = g.traversal().V().toList();
- Vertex target = !x.isEmpty() ? x.get(new Random().nextInt(x.size())) : null;
- Faker faker = new Faker();
- Vertex res = g.traversal().addV("Profile").property("name", faker.name().firstName()).property("lastName", faker.name().lastName())
- .next();
- if (target != null) {
- g.traversal().V(res.id()).addE("friend").to(target).iterate();
- }
- g.close();
-
- x.add(res);
- x.sort(Comparator.comparing(a -> a.id().toString()));
- StringJoiner sj = new StringJoiner("
\n");
- x.forEach(v -> sj.add(v.id().toString() + " - " + (String) v.property("name").value() + " " + (String) v.property("lastName").value()));
- return "Hello, " + name + "! Added " + res.property("name").value() + ". There are " + x.size() + " vertices.
\n" + sj;
- }
-
- @GetMapping("/delete")
- public String delete() {
- ArcadeGraph g = ConnectionPool.getGraph();
- g.traversal().V().hasLabel("Profile").drop().iterate();
- g.close();
- return "Done.";
-
- }
}
diff --git a/src/main/java/com/stktrk/app/application/profile/ProfileController.java b/src/main/java/com/stktrk/app/application/profile/ProfileController.java
new file mode 100644
index 0000000..907215a
--- /dev/null
+++ b/src/main/java/com/stktrk/app/application/profile/ProfileController.java
@@ -0,0 +1,74 @@
+package com.stktrk.app.application.profile;
+
+import com.stktrk.app.domain.profile.ProfileService;
+import com.stktrk.app.domain.profile.types.Profile;
+import jakarta.annotation.Nonnull;
+import jakarta.validation.Valid;
+import lombok.AccessLevel;
+import lombok.AllArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.validation.FieldError;
+import org.springframework.web.bind.MethodArgumentNotValidException;
+import org.springframework.web.bind.annotation.*;
+
+import java.security.InvalidKeyException;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@RestController
+@RequestMapping("profile")
+@AllArgsConstructor(access = AccessLevel.PROTECTED)
+public class ProfileController {
+
+ @Autowired
+ @Nonnull
+ private final ProfileService profileService;
+
+
+ // TODO figure out how to handle the exception.
+ @Nonnull
+ @GetMapping("/")
+ public List> findAll() {
+ return profileService.findAll();
+ }
+
+ @PostMapping ("/")
+ public void addProfile (@Nonnull @Valid @RequestBody Profile profile){
+ profileService.addProfile(profile);
+ }
+
+
+ @GetMapping("/_delete")
+ @Nonnull
+ public ResponseEntity delete() {
+ profileService.deleteAll ();
+ return ResponseEntity.status(HttpStatus.OK)
+ .body("Deleted all Profiles");
+ }
+
+ @GetMapping ("/_fake")
+ @Nonnull
+ public ResponseEntity _fake() {
+ profileService.createFakeProfile();
+ return ResponseEntity.status(HttpStatus.OK)
+ .body("Created Profile");
+ }
+
+
+ @ResponseStatus(HttpStatus.BAD_REQUEST)
+ @ExceptionHandler(MethodArgumentNotValidException.class)
+ @Nonnull
+ public Map handleValidationExceptions(
+ @Nonnull MethodArgumentNotValidException ex) {
+ Map errors = new HashMap<>();
+ ex.getBindingResult().getAllErrors().forEach((error) -> {
+ String fieldName = ((FieldError) error).getField();
+ String errorMessage = error.getDefaultMessage();
+ errors.put(fieldName, errorMessage);
+ });
+ return errors;
+ }
+}
diff --git a/src/main/java/com/stktrk/app/domain/profile/ProfileRepository.java b/src/main/java/com/stktrk/app/domain/profile/ProfileRepository.java
new file mode 100644
index 0000000..16cd786
--- /dev/null
+++ b/src/main/java/com/stktrk/app/domain/profile/ProfileRepository.java
@@ -0,0 +1,17 @@
+package com.stktrk.app.domain.profile;
+
+import com.stktrk.app.domain.profile.types.Profile;
+import jakarta.annotation.Nonnull;
+
+import java.util.List;
+
+public interface ProfileRepository {
+ @Nonnull
+ List> findAll();
+
+ void addProfile(@Nonnull Profile profile);
+
+ void createFakeProfile();
+
+ void deleteAll();
+}
diff --git a/src/main/java/com/stktrk/app/domain/profile/ProfileService.java b/src/main/java/com/stktrk/app/domain/profile/ProfileService.java
new file mode 100644
index 0000000..23b9f26
--- /dev/null
+++ b/src/main/java/com/stktrk/app/domain/profile/ProfileService.java
@@ -0,0 +1,31 @@
+package com.stktrk.app.domain.profile;
+
+import com.stktrk.app.domain.profile.types.Profile;
+import jakarta.annotation.Nonnull;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+@AllArgsConstructor
+public class ProfileService {
+ @Nonnull private final ProfileRepository profileRepository;
+
+ @Nonnull
+ public List> findAll() {
+ return profileRepository.findAll ();
+ }
+
+ public void addProfile (@Nonnull Profile profile) {
+ profileRepository.addProfile (profile);
+ }
+
+ public void createFakeProfile() {
+ profileRepository.createFakeProfile();
+ }
+
+ public void deleteAll() {
+ profileRepository.deleteAll();
+ }
+}
diff --git a/src/main/java/com/stktrk/app/domain/profile/types/Profile.java b/src/main/java/com/stktrk/app/domain/profile/types/Profile.java
new file mode 100644
index 0000000..dec3485
--- /dev/null
+++ b/src/main/java/com/stktrk/app/domain/profile/types/Profile.java
@@ -0,0 +1,20 @@
+package com.stktrk.app.domain.profile.types;
+
+
+import jakarta.annotation.Nullable;
+import jakarta.validation.constraints.NotEmpty;
+import lombok.Builder;
+import lombok.Data;
+
+@Builder
+@Data
+public class Profile {
+
+ @Nullable
+ private String id;
+ @NotEmpty(message = "Name is mandatory")
+ private String name;
+ @NotEmpty(message = "Last name is mandatory")
+ private String lastName;
+
+}
diff --git a/src/main/java/com/stktrk/app/configuration/GraphDbConfig.java b/src/main/java/com/stktrk/app/integration/configuration/types/GraphDbConfig.java
similarity index 51%
rename from src/main/java/com/stktrk/app/configuration/GraphDbConfig.java
rename to src/main/java/com/stktrk/app/integration/configuration/types/GraphDbConfig.java
index a9b77f6..612938c 100644
--- a/src/main/java/com/stktrk/app/configuration/GraphDbConfig.java
+++ b/src/main/java/com/stktrk/app/integration/configuration/types/GraphDbConfig.java
@@ -1,7 +1,6 @@
-package com.stktrk.app.configuration;
+package com.stktrk.app.integration.configuration.types;
-
-import lombok.Builder;
+import jakarta.annotation.Nonnull;
import lombok.Getter;
import lombok.Setter;
import org.springframework.boot.context.properties.ConfigurationProperties;
@@ -13,11 +12,15 @@ import org.springframework.stereotype.Component;
@ConfigurationProperties(prefix = "graph")
public class GraphDbConfig {
- String host;
- int httpPort;
- int postgresPort;
- String graphName;
- String user;
- String password;
+ @Nonnull
+ String host;
+ int httpPort;
+ int postgresPort;
+ @Nonnull
+ String graphName;
+ @Nonnull
+ String user;
+ @Nonnull
+ String password;
}
diff --git a/src/main/java/com/stktrk/app/db/ConnectionPool.java b/src/main/java/com/stktrk/app/integration/flyway/ConnectionPool.java
similarity index 51%
rename from src/main/java/com/stktrk/app/db/ConnectionPool.java
rename to src/main/java/com/stktrk/app/integration/flyway/ConnectionPool.java
index d73f1fa..86c72e7 100644
--- a/src/main/java/com/stktrk/app/db/ConnectionPool.java
+++ b/src/main/java/com/stktrk/app/integration/flyway/ConnectionPool.java
@@ -1,9 +1,10 @@
-package com.stktrk.app.db;
+package com.stktrk.app.integration.flyway;
import com.arcadedb.gremlin.ArcadeGraph;
import com.arcadedb.gremlin.ArcadeGraphFactory;
-import com.stktrk.app.configuration.GraphDbConfig;
-import org.apache.commons.configuration2.Configuration;
+import com.stktrk.app.integration.configuration.types.GraphDbConfig;
+import jakarta.annotation.Nonnull;
+import jakarta.annotation.Nullable;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@@ -11,21 +12,23 @@ import javax.annotation.PostConstruct;
@Component
public class ConnectionPool {
- static ArcadeGraphFactory pool;
+ @Nullable
+ static ArcadeGraphFactory pool;
@Autowired
+ @Nullable
GraphDbConfig graphDbConfig;
@PostConstruct
- void init () {
- try {
- pool = ArcadeGraphFactory.withRemote(graphDbConfig.getHost(), graphDbConfig.getHttpPort(), graphDbConfig.getGraphName(), graphDbConfig.getUser(), graphDbConfig.getPassword());
-
- } catch (Exception e) {
- throw new RuntimeException(e);
- }
+ void init() {
+ pool = ArcadeGraphFactory.withRemote(graphDbConfig.getHost(),
+ graphDbConfig.getHttpPort(),
+ graphDbConfig.getGraphName(),
+ graphDbConfig.getUser(),
+ graphDbConfig.getPassword());
}
+ @Nonnull
public static ArcadeGraph getGraph() {
return pool.get();
}
diff --git a/src/main/java/com/stktrk/app/db/FlywayConfig.java b/src/main/java/com/stktrk/app/integration/flyway/FlywayConfig.java
similarity index 89%
rename from src/main/java/com/stktrk/app/db/FlywayConfig.java
rename to src/main/java/com/stktrk/app/integration/flyway/FlywayConfig.java
index 645f39a..e578207 100644
--- a/src/main/java/com/stktrk/app/db/FlywayConfig.java
+++ b/src/main/java/com/stktrk/app/integration/flyway/FlywayConfig.java
@@ -1,5 +1,6 @@
-package com.stktrk.app.db;
+package com.stktrk.app.integration.flyway;
+import jakarta.annotation.Nullable;
import jakarta.annotation.PostConstruct;
import org.flywaydb.core.Flyway;
import org.flywaydb.core.api.migration.JavaMigration;
@@ -13,13 +14,17 @@ import java.sql.SQLException;
@Configuration
public class FlywayConfig {
+ // TODO move to properties
// Custom migration history table name
+ @Nullable
private static final String SCHEMA_HISTORY_TABLE = "flyway_schema_history";
@Autowired
+ @Nullable
private DataSource dataSource;
@Autowired
+ @Nullable
private ApplicationContext applicationContext;
@PostConstruct
@@ -35,7 +40,7 @@ public class FlywayConfig {
Flyway flyway = Flyway.configure()
.dataSource(dataSource) // No need to configure flyway JDBC URL by using the original DataSource
.defaultSchema(dataSource.getConnection().getSchema())
- .locations("db/migration") // Default migration script path
+ .locations("integration/flyway/migration") // Default migration script path
.table(SCHEMA_HISTORY_TABLE) // Default migration history table is `flyway_schema_history`
.baselineOnMigrate(true) // Default false, must be set to true for initial migration on existing databases
.baselineVersion("0") // Default "1"
diff --git a/src/main/java/com/stktrk/app/db/MigrationWrapper.java b/src/main/java/com/stktrk/app/integration/flyway/MigrationWrapper.java
similarity index 90%
rename from src/main/java/com/stktrk/app/db/MigrationWrapper.java
rename to src/main/java/com/stktrk/app/integration/flyway/MigrationWrapper.java
index 1d0ac2c..702badc 100644
--- a/src/main/java/com/stktrk/app/db/MigrationWrapper.java
+++ b/src/main/java/com/stktrk/app/integration/flyway/MigrationWrapper.java
@@ -1,6 +1,6 @@
-package com.stktrk.app.db;
+package com.stktrk.app.integration.flyway;
-import com.stktrk.app.configuration.GraphDbConfig;
+import com.stktrk.app.integration.configuration.types.GraphDbConfig;
import jakarta.annotation.Nonnull;
import java.sql.Connection;
diff --git a/src/main/java/com/stktrk/app/db/migrations/V1__CreateTest.java b/src/main/java/com/stktrk/app/integration/flyway/migrations/V1__CreateTest.java
similarity index 52%
rename from src/main/java/com/stktrk/app/db/migrations/V1__CreateTest.java
rename to src/main/java/com/stktrk/app/integration/flyway/migrations/V1__CreateTest.java
index d27660a..213e0cf 100644
--- a/src/main/java/com/stktrk/app/db/migrations/V1__CreateTest.java
+++ b/src/main/java/com/stktrk/app/integration/flyway/migrations/V1__CreateTest.java
@@ -1,20 +1,24 @@
-package com.stktrk.app.db.migrations;
+package com.stktrk.app.integration.flyway.migrations;
-import com.stktrk.app.configuration.GraphDbConfig;
-import com.stktrk.app.db.MigrationWrapper;
-import lombok.Data;
+import com.stktrk.app.integration.configuration.types.GraphDbConfig;
+import com.stktrk.app.integration.flyway.MigrationWrapper;
+import jakarta.annotation.Nonnull;
+import lombok.EqualsAndHashCode;
+import lombok.Value;
import org.flywaydb.core.api.migration.BaseJavaMigration;
import org.flywaydb.core.api.migration.Context;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
+@EqualsAndHashCode(callSuper = true)
@Component
-@Data
+@Value
public class V1__CreateTest extends BaseJavaMigration implements MigrationWrapper {
@Autowired
+ @Nonnull
GraphDbConfig graphDbConfig;
- public void migrate(Context context) throws Exception {
+ public void migrate(@Nonnull Context context) throws Exception {
this.executeQuery(graphDbConfig,"CREATE VERTEX TYPE test");
}
diff --git a/src/main/java/com/stktrk/app/db/migrations/V2__CreateUser.java b/src/main/java/com/stktrk/app/integration/flyway/migrations/V2__CreateUser.java
similarity index 52%
rename from src/main/java/com/stktrk/app/db/migrations/V2__CreateUser.java
rename to src/main/java/com/stktrk/app/integration/flyway/migrations/V2__CreateUser.java
index b9bc34b..23b034b 100644
--- a/src/main/java/com/stktrk/app/db/migrations/V2__CreateUser.java
+++ b/src/main/java/com/stktrk/app/integration/flyway/migrations/V2__CreateUser.java
@@ -1,20 +1,24 @@
-package com.stktrk.app.db.migrations;
+package com.stktrk.app.integration.flyway.migrations;
-import com.stktrk.app.configuration.GraphDbConfig;
-import com.stktrk.app.db.MigrationWrapper;
-import lombok.Data;
+import com.stktrk.app.integration.configuration.types.GraphDbConfig;
+import com.stktrk.app.integration.flyway.MigrationWrapper;
+import jakarta.annotation.Nonnull;
+import lombok.EqualsAndHashCode;
+import lombok.Value;
import org.flywaydb.core.api.migration.BaseJavaMigration;
import org.flywaydb.core.api.migration.Context;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
+@EqualsAndHashCode(callSuper = true)
@Component
-@Data
+@Value
public class V2__CreateUser extends BaseJavaMigration implements MigrationWrapper {
@Autowired
+ @Nonnull
GraphDbConfig graphDbConfig;
- public void migrate(Context context) throws Exception {
+ public void migrate(@Nonnull Context context) throws Exception {
this.executeQuery(graphDbConfig,"CREATE VERTEX TYPE user");
}
diff --git a/src/main/java/com/stktrk/app/integration/flyway/migrations/V3__CreateProfile.java b/src/main/java/com/stktrk/app/integration/flyway/migrations/V3__CreateProfile.java
new file mode 100644
index 0000000..a0d2a6f
--- /dev/null
+++ b/src/main/java/com/stktrk/app/integration/flyway/migrations/V3__CreateProfile.java
@@ -0,0 +1,24 @@
+package com.stktrk.app.integration.flyway.migrations;
+
+import com.stktrk.app.integration.configuration.types.GraphDbConfig;
+import com.stktrk.app.integration.flyway.MigrationWrapper;
+import jakarta.annotation.Nonnull;
+import lombok.EqualsAndHashCode;
+import lombok.Value;
+import org.flywaydb.core.api.migration.BaseJavaMigration;
+import org.flywaydb.core.api.migration.Context;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+@EqualsAndHashCode(callSuper = true)
+@Component
+@Value
+public class V3__CreateProfile extends BaseJavaMigration implements MigrationWrapper {
+ @Nonnull
+ @Autowired
+ GraphDbConfig graphDbConfig;
+
+ public void migrate(@Nonnull Context context) throws Exception {
+ this.executeQuery(graphDbConfig,"CREATE VERTEX TYPE Profile IF NOT EXISTS; CREATE PROPERTY Profile.name STRING (MANDATORY true); CREATE PROPERTY Profile.lastName STRING (MANDATORY true, notnull true);");
+ }
+}
diff --git a/src/main/java/com/stktrk/app/integration/profile/ProfileRepositoryImpl.java b/src/main/java/com/stktrk/app/integration/profile/ProfileRepositoryImpl.java
new file mode 100644
index 0000000..508a93a
--- /dev/null
+++ b/src/main/java/com/stktrk/app/integration/profile/ProfileRepositoryImpl.java
@@ -0,0 +1,70 @@
+package com.stktrk.app.integration.profile;
+
+import com.arcadedb.gremlin.ArcadeGraph;
+import com.github.javafaker.Faker;
+import com.stktrk.app.integration.flyway.ConnectionPool;
+import com.stktrk.app.domain.profile.ProfileRepository;
+import com.stktrk.app.domain.profile.types.Profile;
+import com.stktrk.app.utils.EncryptId;
+import jakarta.annotation.Nonnull;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+import java.util.Random;
+
+@Repository
+public class ProfileRepositoryImpl implements ProfileRepository {
+ @Nonnull
+ @Override
+ public List> findAll() {
+ ArcadeGraph g = ConnectionPool.getGraph();
+ List extends Vertex> profiles = g.traversal().V().hasLabel("Profile").toList();
+ g.close();
+
+ return profiles.stream()
+ .map(this::buildProfile)
+ .toList();
+ }
+
+ @Override
+ public void addProfile(@Nonnull Profile profile) {
+ ArcadeGraph g = ConnectionPool.getGraph();
+ Vertex profiles = g.traversal()
+ .addV("Profile")
+ .property("name", profile.getName())
+ .property("lastName", profile.getLastName())
+ .next();
+ g.close();
+ }
+
+ @Override
+ public void createFakeProfile() {
+ Faker faker = new Faker();
+ ArcadeGraph g = ConnectionPool.getGraph();
+ List vertices = g.traversal().V().hasLabel("Profile").toList();
+ Vertex target = vertices.isEmpty() ? null : vertices.get(new Random().nextInt(vertices.size()));
+
+ Vertex res = g.traversal().addV("Profile").property("name", faker.name().firstName()).property("lastName", faker.name().lastName())
+ .next();
+ if (target != null) {
+ g.traversal().V(res.id()).addE("friend").to(target).iterate();
+ }
+ g.close();
+ }
+
+ @Override
+ public void deleteAll () {
+ ArcadeGraph g = ConnectionPool.getGraph();
+ g.traversal().V().hasLabel("Profile").drop().iterate();
+ }
+ @Nonnull
+ private Profile buildProfile (@Nonnull Vertex v) {
+ return Profile.builder()
+ .name((String) v.property("name").value())
+ .lastName((String) v.property("lastName").value())
+ .id(EncryptId.encrypt ((String)v.id()))
+ .build();
+ }
+
+}
diff --git a/src/main/java/com/stktrk/app/utils/EncryptId.java b/src/main/java/com/stktrk/app/utils/EncryptId.java
new file mode 100644
index 0000000..b0e9746
--- /dev/null
+++ b/src/main/java/com/stktrk/app/utils/EncryptId.java
@@ -0,0 +1,44 @@
+package com.stktrk.app.utils;
+
+import com.arcadedb.database.RID;
+import jakarta.annotation.Nonnull;
+import jakarta.validation.constraints.NotEmpty;
+import org.hashids.Hashids;
+
+import java.security.InvalidKeyException;
+
+public class EncryptId {
+
+ // TODO move salt into properties
+ @Nonnull
+ private static final String SALT = "yG8kWVG0kei4wqwXGgt99AXxJWD7K2fnK4xv3BDR0M0AHchvFFCjFJK4VH1nLvm1";
+
+ @Nonnull
+ public static String encrypt(@Nonnull RID rid) {
+ return new Hashids(SALT).encode(rid.getBucketId(), rid.getPosition());
+ }
+
+ // TODO illegal argument exception thrown from RID - if we only allow this to come from the DB, we should be good.
+ @Nonnull
+ public static String encrypt(@NotEmpty String rid) {
+ RID obj = new RID(rid);
+ return new Hashids(SALT).encode(obj.getBucketId(), obj.getPosition());
+
+ }
+
+ @Nonnull
+ public static RID decrypt(@NotEmpty String hash) throws InvalidKeyException {
+ long[] res = new Hashids(SALT).decode(hash);
+ if (res == null || res.length != 2 ) {
+ throw new InvalidKeyException("invalid id");
+ }
+ return new RID((int) res[0], res[1]);
+ }
+
+ @Nonnull
+ private Boolean isValidRid (String rid) {
+ return rid.matches("#\\d+\\.\\d+");
+ }
+
+
+}
diff --git a/src/main/resources/application-rasmus.properties b/src/main/resources/application-rasmus.properties
index e714dbb..4a5d075 100644
--- a/src/main/resources/application-rasmus.properties
+++ b/src/main/resources/application-rasmus.properties
@@ -10,16 +10,16 @@ springdoc.swagger-ui.path=/swagger-ui.html
spring.datasource.driver-class-name=org.postgresql.Driver
-spring.datasource.url= jdbc:postgresql://localhost:7654/flyway_db
+spring.datasource.url= jdbc:postgresql://192.168.178.50:7654/flyway_db
spring.datasource.username=flyway_user
-spring.datasource.password=stdUNmu7KTUQV6KGMKjzHIiwQ2gbipArvg02
+spring.datasource.password=7e7v55UcYGrY0e3UPYI0qtyMA4YJ1ZkTEaoyZ252GluFkiEMHVT9U5ULS7Rg2rGi
spring.datasource.defaultSchema=flyway_db
spring.datasource.hikari.schema=flyway_db
graph.user=root
graph.password=playwithdata
-graph.connection=jdbc:postgresql://192.168.178.29:5432/graph
+graph.connection=jdbc:postgresql://192.168.178.50:5432/graph
graph.http-port:2480
graph.postgres-port:5432
-graph.host=192.168.178.29
+graph.host=192.168.178.50
graph.graph-name=graph
\ No newline at end of file
diff --git a/src/test/java/com/stktrk/app/TestAppApplication.java b/src/test/java/com/stktrk/app/TestAppApplication.java
index 75dcf3f..b263882 100644
--- a/src/test/java/com/stktrk/app/TestAppApplication.java
+++ b/src/test/java/com/stktrk/app/TestAppApplication.java
@@ -1,10 +1,11 @@
package com.stktrk.app;
+import jakarta.annotation.Nonnull;
import org.springframework.boot.SpringApplication;
public class TestAppApplication {
- public static void main(String[] args) {
+ public static void main(@Nonnull String[] args) {
SpringApplication.from(AppApplication::main).with(TestcontainersConfiguration.class).run(args);
}
diff --git a/src/test/java/com/stktrk/app/TestcontainersConfiguration.java b/src/test/java/com/stktrk/app/TestcontainersConfiguration.java
index 27a7ef5..4248f99 100644
--- a/src/test/java/com/stktrk/app/TestcontainersConfiguration.java
+++ b/src/test/java/com/stktrk/app/TestcontainersConfiguration.java
@@ -1,5 +1,6 @@
package com.stktrk.app;
+import jakarta.annotation.Nonnull;
import org.springframework.boot.test.context.TestConfiguration;
import org.springframework.boot.testcontainers.service.connection.ServiceConnection;
import org.springframework.context.annotation.Bean;
@@ -11,6 +12,7 @@ class TestcontainersConfiguration {
@Bean
@ServiceConnection
+ @Nonnull
RabbitMQContainer rabbitContainer() {
return new RabbitMQContainer(DockerImageName.parse("rabbitmq:latest"));
}
diff --git a/src/test/java/com/stktrk/app/utils/EncryptIdTest.java b/src/test/java/com/stktrk/app/utils/EncryptIdTest.java
new file mode 100644
index 0000000..190e4a1
--- /dev/null
+++ b/src/test/java/com/stktrk/app/utils/EncryptIdTest.java
@@ -0,0 +1,22 @@
+package com.stktrk.app.utils;
+
+import com.arcadedb.database.RID;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+import java.security.InvalidKeyException;
+
+class EncryptIdTest {
+
+
+ @Test
+ void encrypt() {
+ Assertions.assertEquals("nOua", EncryptId.encrypt(new RID(1,2L)));
+
+ }
+
+ @Test
+ void decrypt() throws InvalidKeyException {
+ Assertions.assertEquals(new RID(1,2L), EncryptId.decrypt("nOua"));
+ }
+}
\ No newline at end of file