diff --git a/src/main/java/de/w665/fluidcms/db/entity/CObjectEntity.java b/src/main/java/de/w665/fluidcms/db/entity/CObjectEntity.java new file mode 100644 index 0000000..1f09320 --- /dev/null +++ b/src/main/java/de/w665/fluidcms/db/entity/CObjectEntity.java @@ -0,0 +1,20 @@ +package de.w665.fluidcms.db.entity; + +import de.w665.fluidcms.model.ObjectAttribute; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +import java.util.Map; + +@AllArgsConstructor +@NoArgsConstructor +@Getter +@Setter +public class CObjectEntity { + private String id; + private String name; + private String objectTypeId; + private Map attributes; +} diff --git a/src/main/java/de/w665/fluidcms/db/repo/CObjectRepository.java b/src/main/java/de/w665/fluidcms/db/repo/CObjectRepository.java new file mode 100644 index 0000000..4c5cb0b --- /dev/null +++ b/src/main/java/de/w665/fluidcms/db/repo/CObjectRepository.java @@ -0,0 +1,65 @@ +package de.w665.fluidcms.db.repo; + +import com.rethinkdb.RethinkDB; +import com.rethinkdb.net.Connection; +import de.w665.fluidcms.db.RethinkDBConfig; +import de.w665.fluidcms.db.RethinkDBConnector; +import de.w665.fluidcms.db.entity.CObjectEntity; +import de.w665.fluidcms.model.CObject; +import jakarta.annotation.PostConstruct; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@ApplicationScoped +public class CObjectRepository { + + @Inject + RethinkDBConnector connector; + + @Inject + RethinkDBConfig config; + + @Inject + ObjectTypeRepository objectTypeRepository; + + private final String TABLE_NAME = "c_objects"; + private RethinkDB r; + private Connection connection; + + @PostConstruct + public void init() { + this.r = this.connector.getR(); + this.connection = this.connector.getConnection(); + + // Check if table exists + try { + r.db(config.getDatabase()).tableCreate(TABLE_NAME).run(connection); + log.debug("Table " + TABLE_NAME + " created"); + } catch (Exception e) { + log.debug("Table " + TABLE_NAME + " already exists"); + if (config.isAutoresetonstartup()) { + r.db(config.getDatabase()).tableDrop(TABLE_NAME).run(connection); + r.db(config.getDatabase()).tableCreate(TABLE_NAME).run(connection); + log.debug("Table " + TABLE_NAME + " reset"); + } + } + } + + public void insert(CObject cObject) { + // Create entity CObject and replace ObjectType with a reference to the object type (e.g. ObjectType ID) + CObjectEntity entity = new CObjectEntity(cObject.getId(), cObject.getName(), cObject.getType().getId(), cObject.getAttributes()); + r.db(config.getDatabase()).table(TABLE_NAME).insert(entity).run(connection); + } + + public CObject get(String id) { + CObjectEntity entity = r.db(config.getDatabase()).table(TABLE_NAME).filter(r.hashMap("id", id)).run(connection, CObjectEntity.class).first(); + if(entity == null) { + log.warn("Entity CObject with ID {} not found", id); + return null; + } + // Construct CObject from entity + return new CObject(entity.getId(), entity.getName(), objectTypeRepository.get(entity.getId()), entity.getAttributes()); + } +} diff --git a/src/main/java/de/w665/fluidcms/db/repo/ObjectTypeRepository.java b/src/main/java/de/w665/fluidcms/db/repo/ObjectTypeRepository.java new file mode 100644 index 0000000..9acc71d --- /dev/null +++ b/src/main/java/de/w665/fluidcms/db/repo/ObjectTypeRepository.java @@ -0,0 +1,54 @@ +package de.w665.fluidcms.db.repo; + +import com.rethinkdb.RethinkDB; +import com.rethinkdb.net.Connection; +import de.w665.fluidcms.db.RethinkDBConfig; +import de.w665.fluidcms.db.RethinkDBConnector; +import de.w665.fluidcms.model.ObjectType; +import jakarta.annotation.PostConstruct; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@ApplicationScoped +public class ObjectTypeRepository { + + @Inject + RethinkDBConnector connector; + + @Inject + RethinkDBConfig config; + + private final String TABLE_NAME = "object_types"; + private RethinkDB r; + private Connection connection; + + @PostConstruct + public void init() { + this.r = this.connector.getR(); + this.connection = this.connector.getConnection(); + + // Check if table exists + try { + r.db(config.getDatabase()).tableCreate(TABLE_NAME).run(connection); + log.debug("Table " + TABLE_NAME + " created"); + } catch (Exception e) { + log.debug("Table " + TABLE_NAME + " already exists"); + if(config.isAutoresetonstartup()) { + r.db(config.getDatabase()).tableDrop(TABLE_NAME).run(connection); + r.db(config.getDatabase()).tableCreate(TABLE_NAME).run(connection); + log.debug("Table " + TABLE_NAME + " reset"); + } + } + } + + public void insert(ObjectType objectType) { + objectType.setId(r.uuid().run(connection, String.class).first()); + r.db(config.getDatabase()).table(TABLE_NAME).insert(objectType).run(connection); + } + + public ObjectType get(String id) { + return r.db(config.getDatabase()).table(TABLE_NAME).filter(r.hashMap("id", id)).run(connection, ObjectType.class).first(); + } +} diff --git a/src/main/java/de/w665/fluidcms/model/CObject.java b/src/main/java/de/w665/fluidcms/model/CObject.java new file mode 100644 index 0000000..1bfd515 --- /dev/null +++ b/src/main/java/de/w665/fluidcms/model/CObject.java @@ -0,0 +1,19 @@ +package de.w665.fluidcms.model; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +import java.util.Map; + +@AllArgsConstructor +@NoArgsConstructor +@Getter +@Setter +public class CObject { + private String id; + private String name; + private ObjectType type; // TODO: When developing the object repository, replace this with a reference to the object type (e.g. ObjectType ID) + private Map attributes; +} diff --git a/src/main/java/de/w665/fluidcms/model/ObjectType.java b/src/main/java/de/w665/fluidcms/model/ObjectType.java index 690f6ad..ddfef26 100644 --- a/src/main/java/de/w665/fluidcms/model/ObjectType.java +++ b/src/main/java/de/w665/fluidcms/model/ObjectType.java @@ -4,7 +4,7 @@ import lombok.Getter; import lombok.Setter; import lombok.ToString; -import java.util.Map; +import java.util.List; @Getter @Setter @@ -15,5 +15,5 @@ public class ObjectType { private String description; private String icon; private String color; - private Map attributes; + private List attributes; } diff --git a/src/main/java/de/w665/fluidcms/rest/mapping/ObjectTypeResource.java b/src/main/java/de/w665/fluidcms/rest/mapping/ObjectTypeResource.java index aaec461..389084e 100644 --- a/src/main/java/de/w665/fluidcms/rest/mapping/ObjectTypeResource.java +++ b/src/main/java/de/w665/fluidcms/rest/mapping/ObjectTypeResource.java @@ -1,24 +1,30 @@ package de.w665.fluidcms.rest.mapping; +import de.w665.fluidcms.db.repo.ObjectTypeRepository; import de.w665.fluidcms.model.ObjectAttribute; import de.w665.fluidcms.model.ObjectType; import de.w665.fluidcms.model.objectattributes.StringObjectAttribute; +import jakarta.inject.Inject; import jakarta.ws.rs.*; import lombok.extern.slf4j.Slf4j; import org.jboss.resteasy.reactive.RestResponse; -import java.util.HashMap; -import java.util.Map; +import java.util.ArrayList; +import java.util.List; @Slf4j @Path("/objectType") public class ObjectTypeResource { + @Inject + ObjectTypeRepository objectTypeRepository; + @POST @Consumes("application/json") @Produces("application/json") public RestResponse createObjectType(ObjectType objectType) { log.debug(objectType.toString()); + objectTypeRepository.insert(objectType); return RestResponse.ok(objectType); } @@ -42,9 +48,9 @@ public class ObjectTypeResource { attr2.setValue("Attribute " + number + " Value"); // Add the StringObjectAttribute objects to a Map - Map attributes = new HashMap<>(); - attributes.put("attr1", attr1); - attributes.put("attr2", attr2); + List attributes = new ArrayList<>(); + attributes.add(attr1); + attributes.add(attr2); // Create an ObjectType object and set the attributes ObjectType objectType = new ObjectType();