adds chart workspace

This commit is contained in:
litoral05
2026-05-27 14:37:46 +01:00
parent df673e3cb4
commit 4659620072
9 changed files with 272 additions and 1 deletions
@@ -0,0 +1,97 @@
package com.litoralregas.backend.charts;
import jakarta.persistence.*;
import java.time.Instant;
@Entity
@Table(name = "chart_workspace")
public class ChartWorkspace {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@Enumerated(EnumType.STRING)
@Column(nullable = false, unique = true)
private ChartWorkspaceScope scope;
@Column(name = "layout_mode", nullable = false)
private String layoutMode;
@Column(name = "charts_json", nullable = false, columnDefinition = "TEXT")
private String chartsJson;
@Column(name = "created_at", nullable = false, updatable = false)
private Instant createdAt;
@Column(name = "updated_at", nullable = false)
private Instant updatedAt;
protected ChartWorkspace() {
}
public ChartWorkspace(
ChartWorkspaceScope scope,
String layoutMode,
String chartsJson
) {
this.scope = scope;
this.layoutMode = layoutMode;
this.chartsJson = chartsJson;
}
@PrePersist
public void onCreate() {
Instant now = Instant.now();
if (createdAt == null) {
createdAt = now;
}
if (updatedAt == null) {
updatedAt = now;
}
}
@PreUpdate
public void onUpdate() {
updatedAt = Instant.now();
}
public Integer getId() {
return id;
}
public ChartWorkspaceScope getScope() {
return scope;
}
public void setScope(ChartWorkspaceScope scope) {
this.scope = scope;
}
public String getLayoutMode() {
return layoutMode;
}
public void setLayoutMode(String layoutMode) {
this.layoutMode = layoutMode;
}
public String getChartsJson() {
return chartsJson;
}
public void setChartsJson(String chartsJson) {
this.chartsJson = chartsJson;
}
public Instant getCreatedAt() {
return createdAt;
}
public Instant getUpdatedAt() {
return updatedAt;
}
}
@@ -0,0 +1,38 @@
package com.litoralregas.backend.charts;
import com.litoralregas.backend.charts.dto.ChartWorkspaceRequest;
import com.litoralregas.backend.charts.dto.ChartWorkspaceResponse;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/api/chart-workspaces")
public class ChartWorkspaceController {
private final ChartWorkspaceService service;
public ChartWorkspaceController(
ChartWorkspaceService service
) {
this.service = service;
}
@GetMapping("/{scope}")
public ChartWorkspaceResponse getWorkspace(
@PathVariable ChartWorkspaceScope scope
) {
return service.getWorkspace(scope);
}
@PutMapping("/{scope}")
public ChartWorkspaceResponse saveWorkspace(
@PathVariable ChartWorkspaceScope scope,
@RequestBody ChartWorkspaceRequest request
) {
return service.saveWorkspace(
scope,
request
);
}
}
@@ -0,0 +1,13 @@
package com.litoralregas.backend.charts;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.Optional;
public interface ChartWorkspaceRepository
extends JpaRepository<ChartWorkspace, Integer> {
Optional<ChartWorkspace> findByScope(
ChartWorkspaceScope scope
);
}
@@ -0,0 +1,11 @@
package com.litoralregas.backend.charts;
public enum ChartWorkspaceScope {
GLOBAL,
CLIMATE,
IRRIGATION,
METEO,
LIGHTING,
HYDRO,
AEROPONICS
}
@@ -0,0 +1,78 @@
package com.litoralregas.backend.charts;
import com.litoralregas.backend.charts.dto.ChartWorkspaceRequest;
import com.litoralregas.backend.charts.dto.ChartWorkspaceResponse;
import jakarta.transaction.Transactional;
import org.springframework.stereotype.Service;
@Service
public class ChartWorkspaceService {
private final ChartWorkspaceRepository repository;
public ChartWorkspaceService(
ChartWorkspaceRepository repository
) {
this.repository = repository;
}
@Transactional
public ChartWorkspaceResponse saveWorkspace(
ChartWorkspaceScope scope,
ChartWorkspaceRequest request
) {
ChartWorkspace workspace =
repository.findByScope(scope)
.orElseGet(() ->
new ChartWorkspace(
scope,
request.layoutMode(),
request.chartsJson()
)
);
workspace.setLayoutMode(
request.layoutMode()
);
workspace.setChartsJson(
request.chartsJson()
);
ChartWorkspace saved =
repository.save(workspace);
return toResponse(saved);
}
public ChartWorkspaceResponse getWorkspace(
ChartWorkspaceScope scope
) {
ChartWorkspace workspace =
repository.findByScope(scope)
.orElseThrow(() ->
new IllegalArgumentException(
"Workspace not found for scope: "
+ scope
)
);
return toResponse(workspace);
}
private ChartWorkspaceResponse toResponse(
ChartWorkspace workspace
) {
return new ChartWorkspaceResponse(
workspace.getId(),
workspace.getScope(),
workspace.getLayoutMode(),
workspace.getChartsJson(),
workspace.getCreatedAt(),
workspace.getUpdatedAt()
);
}
}
@@ -0,0 +1,7 @@
package com.litoralregas.backend.charts.dto;
public record ChartWorkspaceRequest(
String layoutMode,
String chartsJson
) {
}
@@ -0,0 +1,15 @@
package com.litoralregas.backend.charts.dto;
import com.litoralregas.backend.charts.ChartWorkspaceScope;
import java.time.Instant;
public record ChartWorkspaceResponse(
Integer id,
ChartWorkspaceScope scope,
String layoutMode,
String chartsJson,
Instant createdAt,
Instant updatedAt
) {
}
@@ -32340,7 +32340,7 @@
"signed": false, "signed": false,
"validMin": null, "validMin": null,
"validMax": null "validMax": null
} },
], ],
"schema": "sensor-definitions.v2.decoding-metadata" "schema": "sensor-definitions.v2.decoding-metadata"
} }
@@ -0,0 +1,12 @@
CREATE TABLE chart_workspace (
id INTEGER PRIMARY KEY AUTOINCREMENT,
scope VARCHAR(50) NOT NULL UNIQUE,
layout_mode VARCHAR(50) NOT NULL,
charts_json TEXT NOT NULL,
created_at TIMESTAMP NOT NULL,
updated_at TIMESTAMP NOT NULL
);