Skip to content

Commit

Permalink
working state
Browse files Browse the repository at this point in the history
  • Loading branch information
stefanos-kalantzis committed Dec 1, 2022
1 parent 12aad84 commit 451eed1
Show file tree
Hide file tree
Showing 17 changed files with 564 additions and 6 deletions.
18 changes: 18 additions & 0 deletions .editorconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# http://EditorConfig.org

# top-most EditorConfig file
root = true

[*]
end_of_line = lf
insert_final_newline = true
charset = utf-8
indent_size = 4
indent_style = space
trim_trailing_whitespace = true
# from checkstyle:
max_line_length = 120
ij_continuation_indent_size = 4

[{*.yml, *.yaml}]
indent_size = 2
65 changes: 64 additions & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
<micronaut.version>3.7.4</micronaut.version>
<micronaut.runtime>netty</micronaut.runtime>
<exec.mainClass>mn.flux.response.bug.Application</exec.mainClass>
<version.org.mapstruct>1.5.2.Final</version.org.mapstruct>
</properties>

<repositories>
Expand Down Expand Up @@ -70,6 +71,10 @@
<artifactId>micronaut-reactor-http-client</artifactId>
<scope>compile</scope>
</dependency>
<!-- <dependency>-->
<!-- <groupId>io.micronaut.tracing</groupId>-->
<!-- <artifactId>micronaut-tracing-zipkin</artifactId>-->
<!-- </dependency>-->
<dependency>
<groupId>jakarta.annotation</groupId>
<artifactId>jakarta.annotation-api</artifactId>
Expand All @@ -85,6 +90,19 @@
<artifactId>micronaut-test-junit5</artifactId>
<scope>test</scope>
</dependency>

<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>provided</scope>
</dependency>

<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>${version.org.mapstruct}</version>
</dependency>

<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
Expand All @@ -95,6 +113,25 @@
<artifactId>junit-jupiter-engine</artifactId>
<scope>test</scope>
</dependency>


<dependency>
<groupId>org.testcontainers</groupId>
<artifactId>cassandra</artifactId>
<scope>test</scope>
</dependency>

<dependency>
<groupId>io.rest-assured</groupId>
<artifactId>rest-assured</artifactId>
<scope>test</scope>
</dependency>

<dependency>
<groupId>org.assertj</groupId>
<artifactId>assertj-core</artifactId>
<scope>test</scope>
</dependency>
</dependencies>

<build>
Expand All @@ -111,7 +148,33 @@
<!-- Uncomment to enable incremental compilation -->
<!-- <useIncrementalCompilation>false</useIncrementalCompilation> -->

<annotationProcessorPaths combine.children="append">
<annotationProcessorPaths>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</path>
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${version.org.mapstruct}</version>
</path>
<path>
<!-- version copied from micronaut-cassandra -->
<groupId>com.datastax.oss</groupId>
<artifactId>java-driver-mapper-processor</artifactId>
<version>4.14.1</version>
</path>
<path>
<groupId>io.micronaut</groupId>
<artifactId>micronaut-inject-java</artifactId>
<version>${micronaut.version}</version>
</path>
<path>
<groupId>io.micronaut</groupId>
<artifactId>micronaut-validation</artifactId>
<version>${micronaut.version}</version>
</path>
<path>
<groupId>io.micronaut</groupId>
<artifactId>micronaut-http-validation</artifactId>
Expand Down
17 changes: 17 additions & 0 deletions src/main/java/mn/flux/response/bug/EnumTypeConverters.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package mn.flux.response.bug;

import io.micronaut.context.annotation.Factory;
import io.micronaut.core.convert.ConversionContext;
import io.micronaut.core.convert.TypeConverter;
import jakarta.inject.Singleton;
import java.util.Optional;
import mn.flux.response.bug.model.ResourceName;

@Factory
public class EnumTypeConverters {
@Singleton
@SuppressWarnings({"unused"})
public TypeConverter<String, ResourceName> stringToResourceNameConverter() {
return (String object, Class<ResourceName> targetType, ConversionContext context) -> Optional.of(ResourceName.fromValue(object));
}
}
21 changes: 21 additions & 0 deletions src/main/java/mn/flux/response/bug/RevisionController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package mn.flux.response.bug;

import io.micronaut.http.annotation.Controller;
import io.micronaut.http.annotation.Get;
import io.micronaut.http.annotation.PathVariable;
import lombok.RequiredArgsConstructor;
import mn.flux.response.bug.model.ResourceName;
import reactor.core.publisher.Flux;

@Controller(RevisionController.REVISION_BASE_URI)
@RequiredArgsConstructor
public class RevisionController {
public static final String REVISION_BASE_URI = "/revision";

private final RevisionService revisionService;

@Get("/{resourceName}/{resourceId}")
public Flux<RevisionDto> getAll(@PathVariable ResourceName resourceName, @PathVariable String resourceId) {
return revisionService.findAllBy(resourceId, resourceName);
}
}
38 changes: 38 additions & 0 deletions src/main/java/mn/flux/response/bug/RevisionDto.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package mn.flux.response.bug;

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonInclude.Include;
import io.micronaut.core.annotation.Introspected;
import java.time.Instant;
import java.util.UUID;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import mn.flux.response.bug.model.PublishStatus;
import mn.flux.response.bug.model.ResourceName;

@Data
@NoArgsConstructor
@AllArgsConstructor
@Introspected
public class RevisionDto {

@NotBlank
private String resourceId;

@JsonInclude(Include.NON_NULL)
private UUID id;

@NotNull
private ResourceName resourceName;

private Instant date;

private String comment;

private PublishStatus revisionStatus;

private Long revisionNumber;
}
15 changes: 15 additions & 0 deletions src/main/java/mn/flux/response/bug/RevisionMapper.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package mn.flux.response.bug;

import mn.flux.response.bug.model.Revision;
import org.mapstruct.Mapper;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

@Mapper(componentModel = "jsr330")
public abstract class RevisionMapper {
protected abstract RevisionDto toDto(Revision revision);

public Flux<RevisionDto> toDto(Flux<Revision> revisions) {
return revisions.flatMap(revision -> Mono.just(toDto(revision)));
}
}
20 changes: 20 additions & 0 deletions src/main/java/mn/flux/response/bug/RevisionService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package mn.flux.response.bug;

import jakarta.inject.Singleton;
import lombok.RequiredArgsConstructor;
import mn.flux.response.bug.model.ResourceName;
import mn.flux.response.bug.repository.RevisionDao;
import reactor.core.publisher.Flux;

@Singleton
@RequiredArgsConstructor
public class RevisionService {

private final RevisionMapper revisionMapper;
private final RevisionDao revisionDao;

public Flux<RevisionDto> findAllBy(String resourceId, ResourceName resourceName) {
return Flux.from(revisionDao.findAllBy(resourceId, resourceName))
.transform(revisionMapper::toDto);
}
}
28 changes: 28 additions & 0 deletions src/main/java/mn/flux/response/bug/model/PublishStatus.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package mn.flux.response.bug.model;

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonValue;
import lombok.RequiredArgsConstructor;

@RequiredArgsConstructor
public enum PublishStatus {
DRAFT("draft"),
PUBLISHED("published");

private final String jsonValue;

@JsonCreator
public static ResourceName fromValue(String value) {
for (ResourceName contentType : ResourceName.values()) {
if (contentType.getJsonValue().equalsIgnoreCase(value)) {
return contentType;
}
}
throw new IllegalArgumentException("Unknown ResourceName value");
}

@JsonValue
public String getJsonValue() {
return jsonValue;
}
}
30 changes: 30 additions & 0 deletions src/main/java/mn/flux/response/bug/model/ResourceName.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package mn.flux.response.bug.model;

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonValue;
import io.micronaut.core.annotation.Introspected;
import lombok.RequiredArgsConstructor;

@RequiredArgsConstructor
@Introspected
public enum ResourceName {
ARTICLE("articles"),
VIDEO("videos");

private final String jsonValue;

@JsonCreator
public static ResourceName fromValue(String value) {
for (ResourceName contentType : ResourceName.values()) {
if (contentType.getJsonValue().equalsIgnoreCase(value)) {
return contentType;
}
}
throw new IllegalArgumentException("Unknown ResourceName value");
}

@JsonValue
public String getJsonValue() {
return jsonValue;
}
}
40 changes: 40 additions & 0 deletions src/main/java/mn/flux/response/bug/model/Revision.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package mn.flux.response.bug.model;

import com.datastax.oss.driver.api.mapper.annotations.ClusteringColumn;
import com.datastax.oss.driver.api.mapper.annotations.Entity;
import com.datastax.oss.driver.api.mapper.annotations.PartitionKey;
import java.time.Instant;
import java.util.UUID;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

@Entity
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class Revision {

@PartitionKey
private String resourceId;

@ClusteringColumn(1)
private ResourceName resourceName;

@ClusteringColumn(2)
private UUID id;

private UUID userId;

private Instant date;

private String comment;

private String revisionData;

private PublishStatus revisionStatus;

private Long revisionNumber;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package mn.flux.response.bug.repository;

import com.datastax.oss.driver.api.core.CqlIdentifier;
import com.datastax.oss.driver.api.core.CqlSession;
import com.datastax.oss.driver.api.core.type.codec.ExtraTypeCodecs;
import com.datastax.oss.driver.api.core.type.codec.registry.MutableCodecRegistry;
import io.micronaut.context.annotation.Factory;
import io.micronaut.context.annotation.Requirements;
import io.micronaut.context.annotation.Requires;
import jakarta.inject.Singleton;
import mn.flux.response.bug.model.PublishStatus;
import mn.flux.response.bug.model.ResourceName;

@Factory
@Requirements(@Requires(beans = SchemaBootstrap.class))
public class RepositoryConfig {

@Singleton
@SuppressWarnings({"unused"})
public RevisionDao revisionDao(CqlSession cqlSession) {
MutableCodecRegistry registry = (MutableCodecRegistry) cqlSession.getContext().getCodecRegistry();
registry.register(ExtraTypeCodecs.enumNamesOf(ResourceName.class));
registry.register(ExtraTypeCodecs.enumNamesOf(PublishStatus.class));

RevisionDaoFactory revisionDaoFactory = new RevisionDaoFactoryBuilder(cqlSession).build();
return revisionDaoFactory.createRevisionDao(CqlIdentifier.fromCql(SchemaBootstrap.KEYSPACE_NAME));
}
}
19 changes: 19 additions & 0 deletions src/main/java/mn/flux/response/bug/repository/RevisionDao.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package mn.flux.response.bug.repository;

import com.datastax.dse.driver.api.core.cql.reactive.ReactiveResultSet;
import com.datastax.dse.driver.api.mapper.reactive.MappedReactiveResultSet;
import com.datastax.oss.driver.api.mapper.annotations.Dao;
import com.datastax.oss.driver.api.mapper.annotations.Insert;
import com.datastax.oss.driver.api.mapper.annotations.Select;
import mn.flux.response.bug.model.ResourceName;
import mn.flux.response.bug.model.Revision;

@Dao
public interface RevisionDao {

@Select(orderBy = {"resource_name ASC", "id DESC"}, limit = ":maxResults")
MappedReactiveResultSet<Revision> findAllBy(String resourceId, ResourceName resourceName);

@Insert
ReactiveResultSet save(Revision revision);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package mn.flux.response.bug.repository;


import com.datastax.oss.driver.api.core.CqlIdentifier;
import com.datastax.oss.driver.api.mapper.annotations.DaoFactory;
import com.datastax.oss.driver.api.mapper.annotations.DaoKeyspace;
import com.datastax.oss.driver.api.mapper.annotations.Mapper;

@Mapper
public interface RevisionDaoFactory {

@DaoFactory
RevisionDao createRevisionDao(@DaoKeyspace CqlIdentifier keyspace);
}

0 comments on commit 451eed1

Please sign in to comment.