diff --git a/build.gradle.kts b/build.gradle.kts index 5497c36..47efc18 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -28,6 +28,7 @@ dependencies { implementation("org.springframework.boot:spring-boot-starter-thymeleaf") implementation("org.springframework.boot:spring-boot-starter-web") implementation("org.springframework.boot:spring-boot-starter-actuator") + implementation("org.springdoc:springdoc-openapi-starter-webmvc-ui:2.8.8") compileOnly("org.projectlombok:lombok") developmentOnly("org.springframework.boot:spring-boot-devtools") runtimeOnly("org.postgresql:postgresql") diff --git a/src/main/java/be/seeseepuff/pcinv/PcinvConfig.java b/src/main/java/be/seeseepuff/pcinv/PcinvConfig.java new file mode 100644 index 0000000..b19ca43 --- /dev/null +++ b/src/main/java/be/seeseepuff/pcinv/PcinvConfig.java @@ -0,0 +1,15 @@ +package be.seeseepuff.pcinv; + +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.CorsRegistry; +import org.springframework.web.servlet.config.annotation.EnableWebMvc; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +@EnableWebMvc +public class PcinvConfig implements WebMvcConfigurer { + @Override + public void addCorsMappings(CorsRegistry registry) { + registry.addMapping("/**"); + } +} diff --git a/src/main/java/be/seeseepuff/pcinv/controllers/ApiController.java b/src/main/java/be/seeseepuff/pcinv/controllers/ApiController.java new file mode 100644 index 0000000..63907de --- /dev/null +++ b/src/main/java/be/seeseepuff/pcinv/controllers/ApiController.java @@ -0,0 +1,58 @@ +package be.seeseepuff.pcinv.controllers; + +import be.seeseepuff.pcinv.meta.AssetDescriptor; +import be.seeseepuff.pcinv.models.Asset; +import be.seeseepuff.pcinv.services.AssetService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RequiredArgsConstructor +@RequestMapping("/api") +@RestController +public class ApiController { + private final AssetService assetService; + + @Operation(summary = "Lists all types of assets available in the system.") + @GetMapping("/assetTypes") + public List assets() { + return assetService.getAssetDescriptors().getAssets().stream() + .map(AssetDescriptor::getType) + .toList(); + } + + @Operation(summary = "Lists all information of a specific asset.") + @GetMapping("/asset/{qr}") + public Asset getAsset( + @PathVariable @Parameter(name = "qr", description = "The QR number of the asset") long qr + ) { + return assetService.getAssetByQr(qr); + } + + @Operation(summary = "Adds a work log entry to an asset.") + @PostMapping("/asset/worklog") + public String addWorkLogEntry( + @RequestBody Entry entry + ) { + var qr = entry.qr; + var asset = assetService.getAssetByQr(qr); + if (asset == null) { + throw new IllegalArgumentException("Asset with QR code " + qr + " not found."); + } + if (entry.entry == null || entry.entry.isBlank()) { + throw new IllegalArgumentException("Work log entry comment cannot be empty."); + } + assetService.addWorkLogEntry(asset, entry.entry); + return ""; + } + + public static class Entry { + @Parameter(name = "qr", description = "The QR number of the asset") + public long qr; + @Parameter(name = "entry", description = "The work log entry text") + public String entry; + } +} diff --git a/src/main/java/be/seeseepuff/pcinv/models/ChassisAsset.java b/src/main/java/be/seeseepuff/pcinv/models/ChassisAsset.java index 687c6ac..1733334 100644 --- a/src/main/java/be/seeseepuff/pcinv/models/ChassisAsset.java +++ b/src/main/java/be/seeseepuff/pcinv/models/ChassisAsset.java @@ -4,6 +4,7 @@ import be.seeseepuff.pcinv.meta.AssetInfo; import be.seeseepuff.pcinv.meta.Description; import be.seeseepuff.pcinv.meta.HideInOverview; import be.seeseepuff.pcinv.meta.Property; +import com.fasterxml.jackson.annotation.JsonIgnore; import jakarta.persistence.*; import lombok.Getter; import lombok.Setter; @@ -21,6 +22,7 @@ public class ChassisAsset implements Asset { @Id @GeneratedValue + @JsonIgnore private long id; /// The generic asset associated with this RAM. diff --git a/src/main/java/be/seeseepuff/pcinv/models/CpuAsset.java b/src/main/java/be/seeseepuff/pcinv/models/CpuAsset.java index a73e769..23bbef0 100644 --- a/src/main/java/be/seeseepuff/pcinv/models/CpuAsset.java +++ b/src/main/java/be/seeseepuff/pcinv/models/CpuAsset.java @@ -1,6 +1,7 @@ package be.seeseepuff.pcinv.models; import be.seeseepuff.pcinv.meta.*; +import com.fasterxml.jackson.annotation.JsonIgnore; import jakarta.persistence.*; import lombok.Getter; import lombok.Setter; @@ -21,6 +22,7 @@ public class CpuAsset implements Asset { @Id @GeneratedValue + @JsonIgnore private long id; @OneToOne(orphanRemoval = true) diff --git a/src/main/java/be/seeseepuff/pcinv/models/CustomAsset.java b/src/main/java/be/seeseepuff/pcinv/models/CustomAsset.java index 8ebbff7..9a53839 100644 --- a/src/main/java/be/seeseepuff/pcinv/models/CustomAsset.java +++ b/src/main/java/be/seeseepuff/pcinv/models/CustomAsset.java @@ -1,6 +1,7 @@ package be.seeseepuff.pcinv.models; import be.seeseepuff.pcinv.meta.*; +import com.fasterxml.jackson.annotation.JsonIgnore; import jakarta.persistence.*; import lombok.Getter; import lombok.Setter; @@ -21,6 +22,7 @@ public class CustomAsset implements Asset { @Id @GeneratedValue + @JsonIgnore private long id; @OneToOne(orphanRemoval = true) diff --git a/src/main/java/be/seeseepuff/pcinv/models/DisplayAdapterAsset.java b/src/main/java/be/seeseepuff/pcinv/models/DisplayAdapterAsset.java index b74d1c2..e4ff5ad 100644 --- a/src/main/java/be/seeseepuff/pcinv/models/DisplayAdapterAsset.java +++ b/src/main/java/be/seeseepuff/pcinv/models/DisplayAdapterAsset.java @@ -1,6 +1,7 @@ package be.seeseepuff.pcinv.models; import be.seeseepuff.pcinv.meta.*; +import com.fasterxml.jackson.annotation.JsonIgnore; import jakarta.persistence.*; import lombok.Getter; import lombok.Setter; @@ -18,6 +19,7 @@ public class DisplayAdapterAsset implements Asset { @Id @GeneratedValue + @JsonIgnore private long id; /// The generic asset associated with this RAM. diff --git a/src/main/java/be/seeseepuff/pcinv/models/FloppyDriveAsset.java b/src/main/java/be/seeseepuff/pcinv/models/FloppyDriveAsset.java index 36169fe..c545b49 100644 --- a/src/main/java/be/seeseepuff/pcinv/models/FloppyDriveAsset.java +++ b/src/main/java/be/seeseepuff/pcinv/models/FloppyDriveAsset.java @@ -1,6 +1,7 @@ package be.seeseepuff.pcinv.models; import be.seeseepuff.pcinv.meta.*; +import com.fasterxml.jackson.annotation.JsonIgnore; import jakarta.persistence.*; import lombok.Getter; import lombok.Setter; @@ -18,6 +19,7 @@ public class FloppyDriveAsset implements Asset { @Id @GeneratedValue + @JsonIgnore private long id; /// The generic asset associated with this RAM. diff --git a/src/main/java/be/seeseepuff/pcinv/models/GenericAsset.java b/src/main/java/be/seeseepuff/pcinv/models/GenericAsset.java index 95923f4..2cf7c2a 100644 --- a/src/main/java/be/seeseepuff/pcinv/models/GenericAsset.java +++ b/src/main/java/be/seeseepuff/pcinv/models/GenericAsset.java @@ -1,6 +1,7 @@ package be.seeseepuff.pcinv.models; import be.seeseepuff.pcinv.meta.*; +import com.fasterxml.jackson.annotation.JsonIgnore; import jakarta.persistence.*; import lombok.Getter; import lombok.Setter; @@ -27,7 +28,9 @@ public class GenericAsset { public static final String TYPE = "asset"; - @Id @GeneratedValue + @Id + @GeneratedValue + @JsonIgnore private long id; /// The QR code attached to the asset, used for identification. diff --git a/src/main/java/be/seeseepuff/pcinv/models/HddAsset.java b/src/main/java/be/seeseepuff/pcinv/models/HddAsset.java index 7306e8b..6111a8e 100644 --- a/src/main/java/be/seeseepuff/pcinv/models/HddAsset.java +++ b/src/main/java/be/seeseepuff/pcinv/models/HddAsset.java @@ -1,6 +1,7 @@ package be.seeseepuff.pcinv.models; import be.seeseepuff.pcinv.meta.*; +import com.fasterxml.jackson.annotation.JsonIgnore; import jakarta.persistence.*; import lombok.Getter; import lombok.Setter; @@ -21,6 +22,7 @@ public class HddAsset implements Asset { @Id @GeneratedValue + @JsonIgnore private long id; @OneToOne(orphanRemoval = true) diff --git a/src/main/java/be/seeseepuff/pcinv/models/MotherboardAsset.java b/src/main/java/be/seeseepuff/pcinv/models/MotherboardAsset.java index d3dddb1..22f8501 100644 --- a/src/main/java/be/seeseepuff/pcinv/models/MotherboardAsset.java +++ b/src/main/java/be/seeseepuff/pcinv/models/MotherboardAsset.java @@ -1,6 +1,7 @@ package be.seeseepuff.pcinv.models; import be.seeseepuff.pcinv.meta.*; +import com.fasterxml.jackson.annotation.JsonIgnore; import jakarta.persistence.*; import lombok.Getter; import lombok.Setter; @@ -18,6 +19,7 @@ public class MotherboardAsset implements Asset { @Id @GeneratedValue + @JsonIgnore private long id; /// The generic asset associated with this RAM. diff --git a/src/main/java/be/seeseepuff/pcinv/models/NICAsset.java b/src/main/java/be/seeseepuff/pcinv/models/NICAsset.java index 63bcd5f..cfd5d2b 100644 --- a/src/main/java/be/seeseepuff/pcinv/models/NICAsset.java +++ b/src/main/java/be/seeseepuff/pcinv/models/NICAsset.java @@ -1,6 +1,7 @@ package be.seeseepuff.pcinv.models; import be.seeseepuff.pcinv.meta.*; +import com.fasterxml.jackson.annotation.JsonIgnore; import jakarta.persistence.*; import lombok.Getter; import lombok.Setter; @@ -18,6 +19,7 @@ public class NICAsset implements Asset { @Id @GeneratedValue + @JsonIgnore private long id; /// The generic asset associated with this RAM. diff --git a/src/main/java/be/seeseepuff/pcinv/models/OpticalDriveAsset.java b/src/main/java/be/seeseepuff/pcinv/models/OpticalDriveAsset.java index 279623d..b32b450 100644 --- a/src/main/java/be/seeseepuff/pcinv/models/OpticalDriveAsset.java +++ b/src/main/java/be/seeseepuff/pcinv/models/OpticalDriveAsset.java @@ -1,6 +1,7 @@ package be.seeseepuff.pcinv.models; import be.seeseepuff.pcinv.meta.*; +import com.fasterxml.jackson.annotation.JsonIgnore; import jakarta.persistence.*; import lombok.Getter; import lombok.Setter; @@ -18,6 +19,7 @@ public class OpticalDriveAsset implements Asset { @Id @GeneratedValue + @JsonIgnore private long id; /// The generic asset associated with this RAM. diff --git a/src/main/java/be/seeseepuff/pcinv/models/PowerSupplyAsset.java b/src/main/java/be/seeseepuff/pcinv/models/PowerSupplyAsset.java index b2aae69..fc8be11 100644 --- a/src/main/java/be/seeseepuff/pcinv/models/PowerSupplyAsset.java +++ b/src/main/java/be/seeseepuff/pcinv/models/PowerSupplyAsset.java @@ -1,6 +1,7 @@ package be.seeseepuff.pcinv.models; import be.seeseepuff.pcinv.meta.*; +import com.fasterxml.jackson.annotation.JsonIgnore; import jakarta.persistence.*; import lombok.Getter; import lombok.Setter; @@ -18,6 +19,7 @@ public class PowerSupplyAsset implements Asset { @Id @GeneratedValue + @JsonIgnore private long id; /// The generic asset associated with this RAM. diff --git a/src/main/java/be/seeseepuff/pcinv/models/RamAsset.java b/src/main/java/be/seeseepuff/pcinv/models/RamAsset.java index 55b169c..2706879 100644 --- a/src/main/java/be/seeseepuff/pcinv/models/RamAsset.java +++ b/src/main/java/be/seeseepuff/pcinv/models/RamAsset.java @@ -1,6 +1,7 @@ package be.seeseepuff.pcinv.models; import be.seeseepuff.pcinv.meta.*; +import com.fasterxml.jackson.annotation.JsonIgnore; import jakarta.persistence.*; import lombok.Getter; import lombok.Setter; @@ -21,6 +22,7 @@ public class RamAsset implements Asset { @Id @GeneratedValue + @JsonIgnore private long id; @OneToOne(orphanRemoval = true) diff --git a/src/main/java/be/seeseepuff/pcinv/models/SoundAdapterAsset.java b/src/main/java/be/seeseepuff/pcinv/models/SoundAdapterAsset.java index 4db9f05..2900756 100644 --- a/src/main/java/be/seeseepuff/pcinv/models/SoundAdapterAsset.java +++ b/src/main/java/be/seeseepuff/pcinv/models/SoundAdapterAsset.java @@ -1,6 +1,7 @@ package be.seeseepuff.pcinv.models; import be.seeseepuff.pcinv.meta.*; +import com.fasterxml.jackson.annotation.JsonIgnore; import jakarta.persistence.*; import lombok.Getter; import lombok.Setter; @@ -18,6 +19,7 @@ public class SoundAdapterAsset implements Asset { @Id @GeneratedValue + @JsonIgnore private long id; /// The generic asset associated with this RAM. diff --git a/src/main/java/be/seeseepuff/pcinv/models/WorkLogEntry.java b/src/main/java/be/seeseepuff/pcinv/models/WorkLogEntry.java index a1e0df0..1060ed9 100644 --- a/src/main/java/be/seeseepuff/pcinv/models/WorkLogEntry.java +++ b/src/main/java/be/seeseepuff/pcinv/models/WorkLogEntry.java @@ -1,5 +1,7 @@ package be.seeseepuff.pcinv.models; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; import jakarta.persistence.Id; @@ -18,8 +20,10 @@ import java.time.ZonedDateTime; public class WorkLogEntry { @Id @GeneratedValue + @JsonIgnore private long id; + @JsonIgnore @ManyToOne(optional = false) private GenericAsset asset; @@ -27,5 +31,6 @@ public class WorkLogEntry { private String comment; /// The date and time when the work log entry was created. + @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss") private ZonedDateTime date; }