feat: Add basic certificate models and repositories #8

Merged
torge-hmn merged 4 commits from certificate-models into main 2024-11-17 21:35:27 +00:00
15 changed files with 244 additions and 9 deletions

View file

@ -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")

View file

@ -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<>();
}

View file

@ -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;
}

View file

@ -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;
}

View file

@ -0,0 +1,8 @@
package de.mlessmann.certassist.models;
public enum CertificateType {
ROOT_CA,
STANDALONE_CERT,
SIGNED_CERT,
CLIENT_CERT,
}

View file

@ -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;

View file

@ -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;

View file

@ -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> {}

View file

@ -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> {}

View file

@ -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> {}

View file

@ -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);
}

View file

@ -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");
}
}

View file

@ -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"));
}
}

View file

@ -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");
}
}

View file

@ -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");
} }
} }