Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
46e490c
Initial plan
Copilot Feb 19, 2026
2602567
Add V2_11_0 Flyway migration for stewarding module
Copilot Feb 19, 2026
25c5e9d
Add stewarding entity classes and enums
Copilot Feb 19, 2026
ebf18be
Add MyBatis mapper interfaces for SimRacing Stewarding suite
Copilot Feb 19, 2026
d7aada3
Add service classes for SimRacing Stewarding suite
Copilot Feb 19, 2026
8c1bace
Add Vaadin UI views for SimRacing Stewarding suite
Copilot Feb 19, 2026
2cc500a
Add stewarding Vaadin views and menu navigation integration
Copilot Feb 19, 2026
5a2c96d
Add test classes for SimRacing Stewarding services
Copilot Feb 19, 2026
fd5a6bc
Replace /new form views with dialogs, add STEWARD/DRIVER roles, make …
Copilot Feb 19, 2026
3175867
Fix Add Session dialog, allow drivers to report incidents, enhance de…
Copilot Feb 19, 2026
0be4b5e
Update stewarding views: back nav, entrylist per session, edit/delete…
Copilot Feb 19, 2026
b63d975
Fix migration to use deterministic ORDER BY for session assignment
Copilot Feb 19, 2026
836c062
Restructure stewarding module: Series → Round → Session
Copilot Feb 19, 2026
0ed2282
Add Series/Round/RoundSession mappers and update StewardingEntrylistM…
Copilot Feb 19, 2026
c8c7691
refactor: replace RaceWeekend with Series/Round/RoundSession service …
Copilot Feb 19, 2026
fb3a531
Refactor stewarding views to Series → Round → Session structure
Copilot Feb 19, 2026
ba3c6c6
Restructure stewarding: Series → Round → Session hierarchy (schema-on…
Copilot Feb 19, 2026
c1e951c
Add Flyway V2_15_0 migration: drop/recreate stewarding tables with VA…
Copilot Feb 20, 2026
ea50a78
refactor: change stewarding entity id and FK fields from Integer to S…
Copilot Feb 20, 2026
6528bfb
Update stewarding mapper interfaces: rename tables, use String IDs, e…
Copilot Feb 20, 2026
be71700
Inject IdGenerator into all stewarding service classes for ID generation
Copilot Feb 20, 2026
224f9cf
refactor: replace Notification.show with NotificationService and page…
Copilot Feb 20, 2026
7ffd245
Update stewarding test files to use String IDs and mock IdGenerator
Copilot Feb 20, 2026
eb090e0
Combine Flyway migrations V2_11_0..V2_15_0 into single V2_11_0 per da…
Copilot Feb 20, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,7 @@

public enum UserRoleEnum {
ROLE_ADMIN,
ROLE_MANAGER
ROLE_MANAGER,
ROLE_STEWARD,
ROLE_DRIVER
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ public enum MenuEntityCategory {
LIVE_TIMING("Live Timing"),
ENTRYLIST("Entrylist"),
BALANCE_OF_PERFORMANCE("Balance of Performance"),
STEWARDING("Stewarding"),
MAP("Map");

private final String name;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package de.sustineo.simdesk.entities.stewarding;

import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.time.Instant;

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor(access = AccessLevel.PRIVATE)
public class Appeal {
private String id;
private String decisionId;
private Integer filedByUserId;
private String filedByEntryId;
private String reason;
private AppealStatus status;
private String response;
private Integer respondedByUserId;
private Instant filedAt;
private Instant respondedAt;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package de.sustineo.simdesk.entities.stewarding;

import lombok.Getter;
import lombok.RequiredArgsConstructor;

@Getter
@RequiredArgsConstructor
public enum AppealStatus {
PENDING("Pending"),
ACCEPTED("Accepted"),
REJECTED("Rejected");

private final String description;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package de.sustineo.simdesk.entities.stewarding;

import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.time.Instant;

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor(access = AccessLevel.PRIVATE)
public class Incident {
private String id;
private String sessionId;
private String title;
private String description;
private Integer lap;
private String timestampInSession;
private Double mapMarkerX;
private Double mapMarkerY;
private String videoUrl;
private String involvedCarsText;
private IncidentStatus status;
private Integer reportedByUserId;
private Instant createdAt;
private Instant updatedAt;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package de.sustineo.simdesk.entities.stewarding;

import lombok.Getter;
import lombok.RequiredArgsConstructor;

@Getter
@RequiredArgsConstructor
public enum IncidentStatus {
REPORTED("Reported"),
UNDER_REVIEW("Under Review"),
DECISION_MADE("Decision Made"),
APPEALED("Appealed"),
APPEAL_REVIEWED("Appeal Reviewed"),
CLOSED("Closed");

private final String description;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package de.sustineo.simdesk.entities.stewarding;

import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.time.Instant;

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor(access = AccessLevel.PRIVATE)
public class PenaltyCatalog {
private String id;
private String name;
private String description;
private Instant createdAt;
private Instant updatedAt;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package de.sustineo.simdesk.entities.stewarding;

import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor(access = AccessLevel.PRIVATE)
public class PenaltyDefinition {
private String id;
private String catalogId;
private String code;
private String name;
private String description;
private String category;
private PenaltySessionType sessionType;
private String defaultPenalty;
private Integer severity;
private Integer sortOrder;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package de.sustineo.simdesk.entities.stewarding;

import lombok.Getter;
import lombok.RequiredArgsConstructor;

@Getter
@RequiredArgsConstructor
public enum PenaltySessionType {
PRACTICE("Practice"),
QUALIFYING("Qualifying"),
RACE("Race"),
ALL("All");

private final String description;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package de.sustineo.simdesk.entities.stewarding;

import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor(access = AccessLevel.PRIVATE)
public class ReasoningTemplate {
private String id;
private String name;
private String category;
private String templateText;
private Integer sortOrder;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package de.sustineo.simdesk.entities.stewarding;

import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;

import java.time.Instant;
import java.time.LocalDate;

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor(access = AccessLevel.PRIVATE)
public class Round {
private String id;
private String seriesId;
private String trackId;
private String title;
private LocalDate startDate;
private LocalDate endDate;
private Instant createdAt;
private Instant updatedAt;

@EqualsAndHashCode.Exclude
private StewardingTrack track;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package de.sustineo.simdesk.entities.stewarding;

import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.time.Instant;

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor(access = AccessLevel.PRIVATE)
public class RoundSession {
private String id;
private String roundId;
private StewSessionType sessionType;
private String title;
private Instant startTime;
private Instant endTime;
private Integer sortOrder;
private Instant createdAt;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package de.sustineo.simdesk.entities.stewarding;

import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;

import java.time.Instant;
import java.time.LocalDate;

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor(access = AccessLevel.PRIVATE)
public class Series {
private String id;
private String title;
private String description;
private String discordWebhookUrl;
private Boolean videoUrlEnabled;
private String penaltyCatalogId;
private LocalDate startDate;
private LocalDate endDate;
private Instant createdAt;
private Instant updatedAt;

@EqualsAndHashCode.Exclude
private PenaltyCatalog penaltyCatalog;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package de.sustineo.simdesk.entities.stewarding;

import lombok.Getter;
import lombok.RequiredArgsConstructor;

@Getter
@RequiredArgsConstructor
public enum StewSessionType {
PRACTICE("Practice"),
QUALIFYING("Qualifying"),
RACE("Race");

private final String description;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package de.sustineo.simdesk.entities.stewarding;

import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.time.Instant;

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor(access = AccessLevel.PRIVATE)
public class StewardDecision {
private String id;
private String incidentId;
private String sessionId;
private Integer decidedByUserId;
private String penaltyDefinitionId;
private String customPenalty;
private String reasoning;
private String reasoningTemplateId;
private Boolean isNoAction;
private String penalizedEntryId;
private String penalizedCarText;
private Instant decidedAt;
private String supersededById;
private Boolean isActive;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package de.sustineo.simdesk.entities.stewarding;

import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.time.Instant;

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor(access = AccessLevel.PRIVATE)
public class StewardingEntrylist {
private String id;
private String roundId;
private Instant uploadedAt;
private String rawJson;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package de.sustineo.simdesk.entities.stewarding;

import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor(access = AccessLevel.PRIVATE)
public class StewardingEntrylistDriver {
private String id;
private String entryId;
private String firstName;
private String lastName;
private String shortName;
private String steamId;
private Integer category;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package de.sustineo.simdesk.entities.stewarding;

import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor(access = AccessLevel.PRIVATE)
public class StewardingEntrylistEntry {
private String id;
private String entrylistId;
private Integer raceNumber;
private Integer carModelId;
private String teamName;
private String displayName;
}
Loading
Loading