feat: Add basic certificate models and repositories #8
15 changed files with 244 additions and 9 deletions
|
@ -36,6 +36,7 @@ dependencies {
|
||||||
implementation("org.springframework.boot:spring-boot-starter-jdbc")
|
implementation("org.springframework.boot:spring-boot-starter-jdbc")
|
||||||
implementation("org.xerial:sqlite-jdbc")
|
implementation("org.xerial:sqlite-jdbc")
|
||||||
implementation("org.springframework.boot:spring-boot-starter-data-jpa")
|
implementation("org.springframework.boot:spring-boot-starter-data-jpa")
|
||||||
|
implementation("org.springframework.boot:spring-boot-starter-validation")
|
||||||
implementation("org.hibernate.orm:hibernate-community-dialects")
|
implementation("org.hibernate.orm:hibernate-community-dialects")
|
||||||
|
|
||||||
implementation("org.springframework.boot:spring-boot-starter-security")
|
implementation("org.springframework.boot:spring-boot-starter-security")
|
||||||
|
|
|
@ -0,0 +1,45 @@
|
||||||
|
package de.mlessmann.certassist.models;
|
||||||
|
|
||||||
|
import jakarta.persistence.*;
|
||||||
|
import jakarta.validation.constraints.Min;
|
||||||
|
import jakarta.validation.constraints.NotNull;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import lombok.AccessLevel;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.Setter;
|
||||||
|
|
||||||
|
@Entity
|
||||||
|
@Data
|
||||||
|
public class Certificate {
|
||||||
|
|
||||||
|
@Id
|
||||||
|
@GeneratedValue(strategy = GenerationType.UUID)
|
||||||
|
@Setter(AccessLevel.NONE)
|
||||||
|
private String id;
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
@Enumerated(EnumType.STRING)
|
||||||
|
private CertificateType type;
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
private String commonName;
|
||||||
|
|
||||||
|
private String trustingAuthority;
|
||||||
|
|
||||||
|
@Min(1)
|
||||||
|
private int requestedKeyLength;
|
||||||
|
|
||||||
|
@Min(1)
|
||||||
|
private int requestedValidityDays;
|
||||||
|
|
||||||
|
private String subjectEmailAddress;
|
||||||
|
private String subjectOrganization;
|
||||||
|
private String subjectOrganizationalUnit;
|
||||||
|
private String subjectCountry;
|
||||||
|
private String subjectState;
|
||||||
|
private String subjectLocality;
|
||||||
|
|
||||||
|
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
|
||||||
|
private List<CertificateExtension> certificateExtension = new ArrayList<>();
|
||||||
|
}
|
|
@ -0,0 +1,19 @@
|
||||||
|
package de.mlessmann.certassist.models;
|
||||||
|
|
||||||
|
import jakarta.persistence.*;
|
||||||
|
import lombok.AccessLevel;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.Setter;
|
||||||
|
|
||||||
|
@Entity
|
||||||
|
@Data
|
||||||
|
public class CertificateExtension {
|
||||||
|
|
||||||
|
@Id
|
||||||
|
@GeneratedValue(strategy = GenerationType.UUID)
|
||||||
|
@Setter(AccessLevel.NONE)
|
||||||
|
private String id;
|
||||||
|
|
||||||
|
private String identifier;
|
||||||
|
private String value;
|
||||||
|
}
|
|
@ -0,0 +1,26 @@
|
||||||
|
package de.mlessmann.certassist.models;
|
||||||
|
|
||||||
|
import jakarta.persistence.Entity;
|
||||||
|
import jakarta.persistence.GeneratedValue;
|
||||||
|
import jakarta.persistence.GenerationType;
|
||||||
|
import jakarta.persistence.Id;
|
||||||
|
import lombok.AccessLevel;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.Setter;
|
||||||
|
|
||||||
|
@Entity
|
||||||
|
@Data
|
||||||
|
public class CertificateSubjectPreset {
|
||||||
|
|
||||||
|
@Id
|
||||||
|
@GeneratedValue(strategy = GenerationType.UUID)
|
||||||
|
@Setter(AccessLevel.NONE)
|
||||||
|
private String id;
|
||||||
|
|
||||||
|
private String emailAddress;
|
||||||
|
private String organization;
|
||||||
|
private String organizationalUnit;
|
||||||
|
private String country;
|
||||||
|
private String state;
|
||||||
|
private String locality;
|
||||||
|
}
|
|
@ -0,0 +1,8 @@
|
||||||
|
package de.mlessmann.certassist.models;
|
||||||
|
|
||||||
|
public enum CertificateType {
|
||||||
|
ROOT_CA,
|
||||||
|
STANDALONE_CERT,
|
||||||
|
SIGNED_CERT,
|
||||||
|
CLIENT_CERT,
|
||||||
|
}
|
|
@ -4,6 +4,7 @@ import jakarta.persistence.Entity;
|
||||||
import jakarta.persistence.GeneratedValue;
|
import jakarta.persistence.GeneratedValue;
|
||||||
import jakarta.persistence.GenerationType;
|
import jakarta.persistence.GenerationType;
|
||||||
import jakarta.persistence.Id;
|
import jakarta.persistence.Id;
|
||||||
|
import lombok.AccessLevel;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import lombok.Setter;
|
import lombok.Setter;
|
||||||
|
|
||||||
|
@ -12,8 +13,9 @@ import lombok.Setter;
|
||||||
public class User {
|
public class User {
|
||||||
|
|
||||||
@Id
|
@Id
|
||||||
@GeneratedValue(strategy = GenerationType.SEQUENCE)
|
@GeneratedValue(strategy = GenerationType.UUID)
|
||||||
private Long id;
|
@Setter(AccessLevel.NONE)
|
||||||
|
private String id;
|
||||||
|
|
||||||
@Setter
|
@Setter
|
||||||
private String username;
|
private String username;
|
||||||
|
|
|
@ -9,6 +9,7 @@ import lombok.Data;
|
||||||
public class CertificateRequest {
|
public class CertificateRequest {
|
||||||
|
|
||||||
@Builder.Default
|
@Builder.Default
|
||||||
|
@Deprecated
|
||||||
private String oid = UUID.randomUUID().toString();
|
private String oid = UUID.randomUUID().toString();
|
||||||
|
|
||||||
private RequestType type;
|
private RequestType type;
|
||||||
|
|
|
@ -0,0 +1,8 @@
|
||||||
|
package de.mlessmann.certassist.repositories;
|
||||||
|
|
||||||
|
import de.mlessmann.certassist.models.CertificateExtension;
|
||||||
|
import org.springframework.data.repository.CrudRepository;
|
||||||
|
import org.springframework.stereotype.Repository;
|
||||||
|
|
||||||
|
@Repository
|
||||||
|
public interface CertificateExtensionRepository extends CrudRepository<CertificateExtension, String> {}
|
|
@ -0,0 +1,8 @@
|
||||||
|
package de.mlessmann.certassist.repositories;
|
||||||
|
|
||||||
|
import de.mlessmann.certassist.models.Certificate;
|
||||||
|
import org.springframework.data.repository.CrudRepository;
|
||||||
|
import org.springframework.stereotype.Repository;
|
||||||
|
|
||||||
|
@Repository
|
||||||
|
public interface CertificateRepository extends CrudRepository<Certificate, String> {}
|
|
@ -0,0 +1,8 @@
|
||||||
|
package de.mlessmann.certassist.repositories;
|
||||||
|
|
||||||
|
import de.mlessmann.certassist.models.CertificateSubjectPreset;
|
||||||
|
import org.springframework.data.repository.CrudRepository;
|
||||||
|
import org.springframework.stereotype.Repository;
|
||||||
|
|
||||||
|
@Repository
|
||||||
|
public interface CertificateSubjectPresetRepository extends CrudRepository<CertificateSubjectPreset, String> {}
|
|
@ -5,7 +5,4 @@ import org.springframework.data.repository.CrudRepository;
|
||||||
import org.springframework.stereotype.Repository;
|
import org.springframework.stereotype.Repository;
|
||||||
|
|
||||||
@Repository
|
@Repository
|
||||||
public interface UserRepository extends CrudRepository<User, Long> {
|
public interface UserRepository extends CrudRepository<User, String> {}
|
||||||
|
|
||||||
User findUserById(long id);
|
|
||||||
}
|
|
||||||
|
|
|
@ -0,0 +1,26 @@
|
||||||
|
package de.mlessmann.certassist.repositories;
|
||||||
|
|
||||||
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
|
|
||||||
|
import de.mlessmann.certassist.models.CertificateExtension;
|
||||||
|
import jakarta.transaction.Transactional;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.boot.test.context.SpringBootTest;
|
||||||
|
|
||||||
|
@SpringBootTest
|
||||||
|
class CertificateExtensionRepositoryTest {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private CertificateExtensionRepository repository;
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@Transactional
|
||||||
|
void findCertificate() {
|
||||||
|
CertificateExtension certificateExtension = new CertificateExtension();
|
||||||
|
certificateExtension.setValue("test-value");
|
||||||
|
repository.save(certificateExtension);
|
||||||
|
|
||||||
|
assertThat(repository.findById(certificateExtension.getId()).orElseThrow().getValue()).isEqualTo("test-value");
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,58 @@
|
||||||
|
package de.mlessmann.certassist.repositories;
|
||||||
|
|
||||||
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
|
|
||||||
|
import de.mlessmann.certassist.models.Certificate;
|
||||||
|
import de.mlessmann.certassist.models.CertificateExtension;
|
||||||
|
import de.mlessmann.certassist.models.CertificateType;
|
||||||
|
import jakarta.transaction.Transactional;
|
||||||
|
import java.util.List;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.boot.test.context.SpringBootTest;
|
||||||
|
|
||||||
|
@SpringBootTest
|
||||||
|
class CertificateRepositoryTest {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private CertificateRepository repository;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private CertificateExtensionRepository extensionRepository;
|
||||||
|
|
||||||
|
private Certificate getCertificate() {
|
||||||
|
final Certificate certificate = new Certificate();
|
||||||
|
certificate.setCommonName("test-cn");
|
||||||
|
certificate.setType(CertificateType.SIGNED_CERT);
|
||||||
|
certificate.setRequestedKeyLength(1);
|
||||||
|
certificate.setRequestedValidityDays(1);
|
||||||
|
|
||||||
|
return certificate;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@Transactional
|
||||||
|
void findCertificate() {
|
||||||
|
final Certificate certificate = getCertificate();
|
||||||
|
repository.save(certificate);
|
||||||
|
|
||||||
|
Certificate foundCertificate = repository.findById(certificate.getId()).orElseThrow();
|
||||||
|
assertThat(foundCertificate.getCommonName()).isEqualTo("test-cn");
|
||||||
|
assertThat(foundCertificate.getType()).isEqualTo(CertificateType.SIGNED_CERT);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@Transactional
|
||||||
|
void findCertificateWithExtension() {
|
||||||
|
final Certificate certificate = getCertificate();
|
||||||
|
CertificateExtension extension = new CertificateExtension();
|
||||||
|
extension.setValue("test-ext-value");
|
||||||
|
certificate.setCertificateExtension(List.of(extension));
|
||||||
|
repository.save(certificate);
|
||||||
|
|
||||||
|
assertThat(repository.findById(certificate.getId()).orElseThrow().getCertificateExtension()).hasSize(1);
|
||||||
|
assertThat(extensionRepository.findAll())
|
||||||
|
.singleElement()
|
||||||
|
.satisfies(ce -> assertThat(ce.getValue()).isEqualTo("test-ext-value"));
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,26 @@
|
||||||
|
package de.mlessmann.certassist.repositories;
|
||||||
|
|
||||||
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
|
|
||||||
|
import de.mlessmann.certassist.models.CertificateSubjectPreset;
|
||||||
|
import jakarta.transaction.Transactional;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.boot.test.context.SpringBootTest;
|
||||||
|
|
||||||
|
@SpringBootTest
|
||||||
|
class CertificateSubjectPresetRepositoryTest {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private CertificateSubjectPresetRepository repository;
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@Transactional
|
||||||
|
void findCertificateSubjectPreset() {
|
||||||
|
final CertificateSubjectPreset certificateSubjectPreset = new CertificateSubjectPreset();
|
||||||
|
certificateSubjectPreset.setCountry("DE");
|
||||||
|
repository.save(certificateSubjectPreset);
|
||||||
|
|
||||||
|
assertThat(repository.findById(certificateSubjectPreset.getId()).orElseThrow().getCountry()).isEqualTo("DE");
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,12 +1,13 @@
|
||||||
package de.mlessmann.certassist.repositories;
|
package de.mlessmann.certassist.repositories;
|
||||||
|
|
||||||
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
|
|
||||||
import de.mlessmann.certassist.models.User;
|
import de.mlessmann.certassist.models.User;
|
||||||
|
import jakarta.transaction.Transactional;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.boot.test.context.SpringBootTest;
|
import org.springframework.boot.test.context.SpringBootTest;
|
||||||
|
|
||||||
import static org.assertj.core.api.Assertions.assertThat;
|
|
||||||
|
|
||||||
@SpringBootTest
|
@SpringBootTest
|
||||||
class UserRepositoryTest {
|
class UserRepositoryTest {
|
||||||
|
|
||||||
|
@ -14,11 +15,12 @@ class UserRepositoryTest {
|
||||||
private UserRepository userRepository;
|
private UserRepository userRepository;
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@Transactional
|
||||||
void findUserById() {
|
void findUserById() {
|
||||||
final User user = new User();
|
final User user = new User();
|
||||||
user.setUsername("test");
|
user.setUsername("test");
|
||||||
userRepository.save(user);
|
userRepository.save(user);
|
||||||
|
|
||||||
assertThat(userRepository.findUserById(user.getId()).getUsername()).isEqualTo("test");
|
assertThat(userRepository.findById(user.getId()).orElseThrow().getUsername()).isEqualTo("test");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue