diff --git a/application/build.gradle.kts b/application/build.gradle.kts index 9c621002..9c53f754 100644 --- a/application/build.gradle.kts +++ b/application/build.gradle.kts @@ -17,6 +17,7 @@ dependencies { implementation("org.springframework.kafka:spring-kafka") implementation(project(":components:psk")) + implementation(project(":components:firmware")) implementation(kotlin("reflect")) implementation(libs.logging) @@ -65,6 +66,7 @@ testing { dependencies { implementation(project()) implementation(project(":components:psk")) + implementation(project(":components:firmware")) implementation("org.springframework.boot:spring-boot-starter-data-jpa") implementation(libs.kafkaAvro) implementation(libs.avro) diff --git a/application/src/main/resources/db/migration/V8__firmware.sql b/application/src/main/resources/db/migration/V8__firmware.sql new file mode 100644 index 00000000..bc713059 --- /dev/null +++ b/application/src/main/resources/db/migration/V8__firmware.sql @@ -0,0 +1,22 @@ +CREATE TABLE firmware +( + id uuid not null, + name varchar(255) not null, + hash varchar(255) not null, + previous_firmware_id uuid null, + PRIMARY KEY (id), + CONSTRAINT fk_previous_firmware + FOREIGN KEY (previous_firmware_id) + REFERENCES firmware (id) +); + +CREATE TABLE firmware_packet +( + firmware_id uuid not null, + packet_number int not null, + packet varchar(1024), + PRIMARY KEY (firmware_id, packet_number), + CONSTRAINT fk_firmware + FOREIGN KEY (firmware_id) + REFERENCES firmware (id) +) diff --git a/components/firmware/build.gradle.kts b/components/firmware/build.gradle.kts new file mode 100644 index 00000000..eb780b0b --- /dev/null +++ b/components/firmware/build.gradle.kts @@ -0,0 +1,11 @@ +dependencies { + implementation("org.springframework.boot:spring-boot-starter-data-jpa") + implementation("org.springframework.security:spring-security-core") + + implementation(libs.logging) + + testImplementation("org.springframework.boot:spring-boot-starter-test") + testImplementation(libs.mockitoKotlin) + + testRuntimeOnly("org.junit.platform:junit-platform-launcher") +} diff --git a/components/firmware/src/main/kotlin/org/gxf/crestdeviceservice/firmware/entity/Firmware.kt b/components/firmware/src/main/kotlin/org/gxf/crestdeviceservice/firmware/entity/Firmware.kt new file mode 100644 index 00000000..c9164371 --- /dev/null +++ b/components/firmware/src/main/kotlin/org/gxf/crestdeviceservice/firmware/entity/Firmware.kt @@ -0,0 +1,21 @@ +// SPDX-FileCopyrightText: Contributors to the GXF project +// +// SPDX-License-Identifier: Apache-2.0 +package org.gxf.crestdeviceservice.firmware.entity + +import jakarta.annotation.Generated +import jakarta.persistence.Entity +import jakarta.persistence.Id +import jakarta.persistence.OneToMany +import java.util.UUID +import org.hibernate.annotations.Cascade +import org.hibernate.annotations.CascadeType + +@Entity +class Firmware( + @Id @Generated val id: UUID, + val name: String, + val hash: String, + val previousFirmwareId: UUID?, + @OneToMany @Cascade(CascadeType.ALL) val packets: List +) diff --git a/components/firmware/src/main/kotlin/org/gxf/crestdeviceservice/firmware/entity/FirmwarePacket.kt b/components/firmware/src/main/kotlin/org/gxf/crestdeviceservice/firmware/entity/FirmwarePacket.kt new file mode 100644 index 00000000..09dc8e08 --- /dev/null +++ b/components/firmware/src/main/kotlin/org/gxf/crestdeviceservice/firmware/entity/FirmwarePacket.kt @@ -0,0 +1,17 @@ +// SPDX-FileCopyrightText: Contributors to the GXF project +// +// SPDX-License-Identifier: Apache-2.0 +package org.gxf.crestdeviceservice.firmware.entity + +import jakarta.persistence.Entity +import jakarta.persistence.Id +import jakarta.persistence.IdClass +import jakarta.persistence.ManyToOne + +@Entity +@IdClass(FirmwarePacketCompositeKey::class) +class FirmwarePacket( + @ManyToOne @Id val firmware: Firmware, + @Id val packetNumber: Int, + val packet: String +) diff --git a/components/firmware/src/main/kotlin/org/gxf/crestdeviceservice/firmware/entity/FirmwarePacketCompositeKey.kt b/components/firmware/src/main/kotlin/org/gxf/crestdeviceservice/firmware/entity/FirmwarePacketCompositeKey.kt new file mode 100644 index 00000000..9237d804 --- /dev/null +++ b/components/firmware/src/main/kotlin/org/gxf/crestdeviceservice/firmware/entity/FirmwarePacketCompositeKey.kt @@ -0,0 +1,8 @@ +// SPDX-FileCopyrightText: Contributors to the GXF project +// +// SPDX-License-Identifier: Apache-2.0 +package org.gxf.crestdeviceservice.firmware.entity + +import java.io.Serializable + +data class FirmwarePacketCompositeKey(val firmware: Firmware, val packetNumber: Int) : Serializable diff --git a/components/firmware/src/main/kotlin/org/gxf/crestdeviceservice/firmware/repository/FirmwarePacketRepository.kt b/components/firmware/src/main/kotlin/org/gxf/crestdeviceservice/firmware/repository/FirmwarePacketRepository.kt new file mode 100644 index 00000000..53382f11 --- /dev/null +++ b/components/firmware/src/main/kotlin/org/gxf/crestdeviceservice/firmware/repository/FirmwarePacketRepository.kt @@ -0,0 +1,12 @@ +// SPDX-FileCopyrightText: Contributors to the GXF project +// +// SPDX-License-Identifier: Apache-2.0 +package org.gxf.crestdeviceservice.firmware.repository + +import org.gxf.crestdeviceservice.firmware.entity.FirmwarePacket +import org.gxf.crestdeviceservice.firmware.entity.FirmwarePacketCompositeKey +import org.springframework.data.repository.CrudRepository +import org.springframework.stereotype.Repository + +@Repository +interface FirmwarePacketRepository : CrudRepository diff --git a/components/firmware/src/main/kotlin/org/gxf/crestdeviceservice/firmware/repository/FirmwareRepository.kt b/components/firmware/src/main/kotlin/org/gxf/crestdeviceservice/firmware/repository/FirmwareRepository.kt new file mode 100644 index 00000000..cd44b6c8 --- /dev/null +++ b/components/firmware/src/main/kotlin/org/gxf/crestdeviceservice/firmware/repository/FirmwareRepository.kt @@ -0,0 +1,13 @@ +// SPDX-FileCopyrightText: Contributors to the GXF project +// +// SPDX-License-Identifier: Apache-2.0 +package org.gxf.crestdeviceservice.firmware.repository + +import org.gxf.crestdeviceservice.firmware.entity.Firmware +import org.springframework.data.repository.CrudRepository +import org.springframework.stereotype.Repository + +@Repository +interface FirmwareRepository : CrudRepository { + fun findByName(name: String): Firmware +} diff --git a/components/firmware/src/main/kotlin/org/gxf/crestdeviceservice/firmware/service/FirmwareService.kt b/components/firmware/src/main/kotlin/org/gxf/crestdeviceservice/firmware/service/FirmwareService.kt new file mode 100644 index 00000000..567fbad6 --- /dev/null +++ b/components/firmware/src/main/kotlin/org/gxf/crestdeviceservice/firmware/service/FirmwareService.kt @@ -0,0 +1,9 @@ +// SPDX-FileCopyrightText: Contributors to the GXF project +// +// SPDX-License-Identifier: Apache-2.0 +package org.gxf.crestdeviceservice.firmware.service + +import org.gxf.crestdeviceservice.firmware.repository.FirmwareRepository +import org.springframework.stereotype.Service + +@Service class FirmwareService(private val firmwareRepository: FirmwareRepository) diff --git a/components/psk/src/main/kotlin/org/gxf/crestdeviceservice/psk/entity/PreSharedKeyCompositeKey.kt b/components/psk/src/main/kotlin/org/gxf/crestdeviceservice/psk/entity/PreSharedKeyCompositeKey.kt index 53730973..56dc5425 100644 --- a/components/psk/src/main/kotlin/org/gxf/crestdeviceservice/psk/entity/PreSharedKeyCompositeKey.kt +++ b/components/psk/src/main/kotlin/org/gxf/crestdeviceservice/psk/entity/PreSharedKeyCompositeKey.kt @@ -5,6 +5,6 @@ package org.gxf.crestdeviceservice.psk.entity import java.io.Serializable -class PreSharedKeyCompositeKey(val identity: String?, val revision: Int?) : Serializable { +data class PreSharedKeyCompositeKey(val identity: String?, val revision: Int?) : Serializable { constructor() : this(null, null) } diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 2c352119..a4b76b95 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 0aaefbca..df97d72b 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/scripts/pre-commit b/scripts/pre-commit index 7c2770c3..d8df2b14 100755 --- a/scripts/pre-commit +++ b/scripts/pre-commit @@ -3,6 +3,8 @@ echo "*********************************************************" echo "Running git pre-commit hook. Running Spotless Apply... " echo "*********************************************************" +[[ -s "$HOME/.sdkman/bin/sdkman-init.sh" ]] && source "$HOME/.sdkman/bin/sdkman-init.sh" + # Gather the staged files - to make sure changes are saved only for these files. stagedFiles=$(git diff --staged --name-only) diff --git a/settings.gradle.kts b/settings.gradle.kts index 11a461ca..908c76b9 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -6,6 +6,7 @@ rootProject.name = "sng-crest-device-service" include("application") include("components:psk") +include("components:firmware") dependencyResolutionManagement { versionCatalogs {