Skip to content
This repository was archived by the owner on Sep 29, 2021. It is now read-only.
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 38 additions & 6 deletions .github/workflows/pipeline.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,15 @@ on:
pull_request:
workflow_dispatch:

env:
docker_image: ghcr.io/echo-karriere/backend:${{ github.sha }}
docker_image_latest: ghcr.io/echo-karriere/backend:latest

jobs:
tests:
check-build:
runs-on: ubuntu-latest
env:
DATABASE_URL: jdbc:postgresql://localhost:32789/test_db
AUTH0_AUDIENCE: ${{ secrets.AUTH0_AUDIENCE }}
AUTH0_DOMAIN: ${{ secrets.AUTH0_DOMAIN }}

services:
postgres:
Expand Down Expand Up @@ -51,9 +53,11 @@ jobs:
restore-keys: |
${{ runner.os }}-gradle-

- uses: actions/setup-java@v1
- uses: actions/setup-java@v2
with:
java-version: 11
distribution: adopt
java-version: 16
# cache: gradle TODO: Enable once released

- name: Check
run: ./gradlew check --info
Expand All @@ -68,6 +72,7 @@ jobs:
path: "${{ github.workspace }}/build/libs/*.jar"

- name: SonarQube analysis
if: ${{ false }}
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
Expand All @@ -80,10 +85,37 @@ jobs:
rm -f ~/.gradle/caches/modules-2/modules-2.lock
rm -f ~/.gradle/caches/modules-2/gc.properties

docker:
needs: [ check-build ]
if: ${{ github.ref =='refs/heads/main' || github.ref == 'refs/heads/production' }}
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v2

- name: Download artifact from build job
uses: actions/download-artifact@v2
with:
name: backend

- name: Build
run: docker build . --tag ${docker_image} --tag ${docker_image_latest} --build-arg JAR_FILE=backend

- uses: docker/login-action@v1
with:
registry: ghcr.io
username: ${{ github.repository_owner }}
password: ${{ secrets.GITHUB_TOKEN }}

- name: Push image
run: |
docker push ${docker_image}
docker push ${docker_image_latest}

deploy-dev:
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
runs-on: ubuntu-latest
needs: [tests]
needs: [ docker ]
environment:
name: "dev"
url: ${{ steps.deploy-to-webapp.outputs.webapp-url }}
Expand Down
20 changes: 20 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
FROM adoptopenjdk:16-jre-hotspot as builder

WORKDIR /app

ARG JAR_FILE=build/libs/*.jar

COPY ${JAR_FILE} application.jar

RUN java -Djarmode=layertools -jar application.jar extract

FROM adoptopenjdk:16-jre-hotspot

WORKDIR /app

COPY --from=builder /app/dependencies/ ./
COPY --from=builder /app/spring-boot-loader/ ./
COPY --from=builder /app/snapshot-dependencies/ ./
COPY --from=builder /app/application/ ./

ENTRYPOINT ["java", "org.springframework.boot.loader.JarLauncher"]
50 changes: 19 additions & 31 deletions build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -3,43 +3,35 @@ import org.gradle.api.tasks.testing.logging.TestLogEvent

plugins {
jacoco
java
id("io.freefair.lombok").version("5.3.0")
id("org.springframework.boot").version("2.4.4")
id("application")
id("org.springframework.boot").version("2.5.4")
id("io.spring.dependency-management").version("1.0.11.RELEASE")
id("com.netflix.dgs.codegen").version("4.4.1")
id("org.sonarqube").version("3.1.1")
id("com.netflix.dgs.codegen").version("5.0.5")
id("org.sonarqube").version("3.3")
id("org.flywaydb.flyway").version("7.7.0")
id("nu.studer.jooq").version("5.2.1")
id("nu.studer.jooq").version("6.0")
id("com.github.ben-manes.versions").version("0.39.0")
}

repositories {
mavenCentral()
jcenter()
}

dependencyManagement {
imports {
mavenBom("org.keycloak.bom:keycloak-adapter-bom:12.0.4")
}
}

dependencies {
implementation("org.springframework.boot", "spring-boot-starter-web")
implementation("org.springframework.boot", "spring-boot-starter-actuator")
implementation("org.springframework.boot", "spring-boot-starter-jooq")
implementation("org.springframework.boot", "spring-boot-starter-security")
implementation("org.keycloak", "keycloak-spring-boot-starter")
developmentOnly("org.springframework.boot", "spring-boot-devtools")

jooqGenerator("org.postgresql", "postgresql", "42.2.19")
jooqGenerator("org.postgresql", "postgresql", "42.2.23")

implementation("org.flywaydb", "flyway-core", "7.7.0")
runtimeOnly("org.postgresql", "postgresql", "42.2.19")
implementation("org.flywaydb", "flyway-core", "7.14.0")
runtimeOnly("org.postgresql", "postgresql", "42.2.23")

implementation(platform("com.netflix.graphql.dgs:graphql-dgs-platform-dependencies:3.10.2"))
implementation(platform("com.netflix.graphql.dgs:graphql-dgs-platform-dependencies:4.5.1"))
implementation("com.netflix.graphql.dgs", "graphql-dgs-spring-boot-starter")
implementation("com.graphql-java", "graphql-java-extended-scalars", "15.0.0")
implementation("com.netflix.graphql.dgs", "graphql-dgs-extended-scalars")

testImplementation("org.springframework.boot", "spring-boot-starter-test") {
exclude("org.junit.vintage", "junit-vintage-engine")
Expand All @@ -50,18 +42,16 @@ group = "no.echokarriere"
version = "0.0.1-SNAPSHOT"
description = "backend"

configurations {
compileOnly {
extendsFrom(configurations.annotationProcessor.get())
}
}

java {
toolchain {
languageVersion.set(JavaLanguageVersion.of(11))
languageVersion.set(JavaLanguageVersion.of(16))
}
}

tasks.jar {
enabled = false
}

tasks.withType<Test> {
useJUnitPlatform()
failFast = true
Expand All @@ -88,8 +78,6 @@ flyway {
}

jooq {
version.set(dependencyManagement.importedProperties["jooq.version"])
edition.set(nu.studer.gradle.jooq.JooqEdition.OSS)
configurations {
create("main") {
jooqConfiguration.apply {
Expand Down Expand Up @@ -132,9 +120,9 @@ tasks.named<nu.studer.gradle.jooq.JooqGenerate>("generateJooq") {
tasks.jacocoTestReport {
dependsOn(tasks.test)
reports {
xml.isEnabled = true
xml.destination = File("$buildDir/reports/jacoco/test/jacoco.xml")
html.isEnabled = true
xml.required.set(true)
xml.outputLocation.set(File("$buildDir/reports/jacoco/test/jacoco.xml"))
html.required.set(true)
}
}

Expand Down
2 changes: 1 addition & 1 deletion docker-compose.test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ services:
container_name: "echo_backend_test_db"
image: postgres:11.6
ports:
- 32789:5432
- "32789:5432"
environment:
POSTGRES_DB: test_db
POSTGRES_USER: karriere
Expand Down
2 changes: 1 addition & 1 deletion docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ services:
volumes:
- postgres_data:/var/lib/postgresql/data
ports:
- 5432:5432
- "5432:5432"
env_file: .env

volumes:
Expand Down
2 changes: 1 addition & 1 deletion gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-6.8.3-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-all.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
2 changes: 0 additions & 2 deletions lombok.config

This file was deleted.

6 changes: 3 additions & 3 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@
"author": "Sondre Nilsen <nilsen.sondre@gmail.com>",
"devDependencies": {
"@echo-karriere/clubhouse-lint": "0.3.0",
"husky": "6.0.0",
"lint-staged": "10.5.4",
"prettier": "2.2.1"
"husky": "7.0.1",
"lint-staged": "11.1.2",
"prettier": "2.3.2"
},
"scripts": {
"postinstall": "husky install",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,11 @@

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.r2dbc.R2dbcAutoConfiguration;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;

@SpringBootApplication
// TODO: Remove exclusion once Spring Boot 2.6 is released
@SpringBootApplication(exclude = {R2dbcAutoConfiguration.class})
@EnableGlobalMethodSecurity(securedEnabled = true, jsr250Enabled = true)
public class BackendApplication {
public static void main(String[] args) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,12 @@ public class CategoryConverter implements Converter<CategoryEntity, Category> {
@Override
public Category convert(CategoryEntity source) {
return new Category(
source.getId().toString(),
source.getTitle(),
source.getDescription(),
source.getSlug(),
source.getCreatedAt(),
source.getModifiedAt()
source.id().toString(),
source.title(),
source.description(),
source.slug(),
source.createdAt(),
source.modifiedAt()
);
}
}
22 changes: 8 additions & 14 deletions src/main/java/no/echokarriere/backend/category/CategoryEntity.java
Original file line number Diff line number Diff line change
@@ -1,25 +1,19 @@
package no.echokarriere.backend.category;

import lombok.Builder;
import lombok.RequiredArgsConstructor;
import lombok.Value;
import no.echokarriere.graphql.types.CreateCategoryInput;
import no.echokarriere.graphql.types.UpdateCategoryInput;

import java.time.OffsetDateTime;
import java.util.UUID;

@Value
@RequiredArgsConstructor
@Builder
public class CategoryEntity {
UUID id;
String title;
String description;
String slug;
OffsetDateTime createdAt;
OffsetDateTime modifiedAt;

public record CategoryEntity(
UUID id,
String title,
String description,
String slug,
OffsetDateTime createdAt,
OffsetDateTime modifiedAt
) {
CategoryEntity(CreateCategoryInput input) {
this(UUID.randomUUID(), input.getTitle(), input.getDescription(), input.getSlug(), OffsetDateTime.now(), null);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ private static CategoryEntity map(CategoryRecord it) {
public Optional<CategoryEntity> create(CategoryEntity entity) {
return dsl.insertInto(CATEGORY)
.columns(CATEGORY.ID, CATEGORY.TITLE, CATEGORY.DESCRIPTION, CATEGORY.SLUG)
.values(entity.getId(), entity.getTitle(), entity.getDescription(), entity.getSlug())
.values(entity.id(), entity.title(), entity.description(), entity.slug())
.returning()
.fetchOptional()
.map(CategoryRepository::map);
Expand All @@ -40,9 +40,9 @@ public Optional<CategoryEntity> update(CategoryEntity entity) {
return dsl.update(CATEGORY)
.set(
row(CATEGORY.TITLE, CATEGORY.DESCRIPTION, CATEGORY.SLUG, CATEGORY.MODIFIED_AT),
row(entity.getTitle(), entity.getDescription(), entity.getSlug(), OffsetDateTime.now())
row(entity.title(), entity.description(), entity.slug(), OffsetDateTime.now())
)
.where(CATEGORY.ID.eq(entity.getId()))
.where(CATEGORY.ID.eq(entity.id()))
.returning()
.fetchOptional()
.map(CategoryRepository::map);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,11 @@ public class CompanyConverter implements Converter<CompanyEntity, Company> {
@Override
public Company convert(CompanyEntity source) {
return new Company(
source.getId().toString(),
source.getName(),
source.getHomepage(),
source.getCreatedAt(),
source.getModifiedAt()
source.id().toString(),
source.name(),
source.homepage(),
source.createdAt(),
source.modifiedAt()
);
}
}
31 changes: 9 additions & 22 deletions src/main/java/no/echokarriere/backend/company/CompanyEntity.java
Original file line number Diff line number Diff line change
@@ -1,37 +1,24 @@
package no.echokarriere.backend.company;

import lombok.Builder;
import lombok.RequiredArgsConstructor;
import lombok.Value;
import no.echokarriere.graphql.types.CreateCompanyInput;
import no.echokarriere.graphql.types.UpdateCompanyInput;

import java.time.OffsetDateTime;
import java.util.UUID;

@Value
@RequiredArgsConstructor
@Builder
public class CompanyEntity {
UUID id;
String name;
String homepage;
OffsetDateTime createdAt;
OffsetDateTime modifiedAt;
public record CompanyEntity(
UUID id,
String name,
String homepage,
OffsetDateTime createdAt,
OffsetDateTime modifiedAt
) {

public CompanyEntity(CreateCompanyInput input) {
this.id = UUID.randomUUID();
this.name = input.getName();
this.homepage = input.getHomepage();
this.createdAt = OffsetDateTime.now();
this.modifiedAt = null;
this(UUID.randomUUID(), input.getName(), input.getHomepage(), OffsetDateTime.now(), null);
}

public CompanyEntity(UUID id, UpdateCompanyInput input) {
this.id = id;
this.name = input.getName();
this.homepage = input.getHomepage();
this.createdAt = OffsetDateTime.now();
this.modifiedAt = null;
this(id, input.getName(), input.getHomepage(), OffsetDateTime.now(), null);
}
}
Loading