From 265a96acc12becd8cacaa3fd7934a775777296c9 Mon Sep 17 00:00:00 2001 From: Dylan De Faoite Date: Sun, 3 May 2026 12:51:32 +0100 Subject: [PATCH] feat: add Stream table & boilerplate --- .../com/ddf/vodsystem/entities/Stream.java | 31 +++++++++++++++++++ .../java/com/ddf/vodsystem/entities/User.java | 3 ++ .../repositories/StreamRepository.java | 9 ++++++ .../repositories/UserRepository.java | 3 ++ .../ddf/vodsystem/services/StreamService.java | 24 ++++++++++++++ .../ddf/vodsystem/services/UserService.java | 4 +++ src/main/resources/db/schema.sql | 16 ++++++++-- 7 files changed, 88 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/ddf/vodsystem/entities/Stream.java create mode 100644 src/main/java/com/ddf/vodsystem/repositories/StreamRepository.java create mode 100644 src/main/java/com/ddf/vodsystem/services/StreamService.java diff --git a/src/main/java/com/ddf/vodsystem/entities/Stream.java b/src/main/java/com/ddf/vodsystem/entities/Stream.java new file mode 100644 index 0000000..204fdb9 --- /dev/null +++ b/src/main/java/com/ddf/vodsystem/entities/Stream.java @@ -0,0 +1,31 @@ +package com.ddf.vodsystem.entities; + +import jakarta.persistence.*; +import lombok.Data; +import com.fasterxml.jackson.annotation.JsonIgnore; + +import java.time.LocalDateTime; + +@Entity +@Table(name = "streams") +@Data +public class Stream { + @Id + @Column(name = "id", nullable = false, unique = true) + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ManyToOne(fetch = FetchType.LAZY) + @JsonIgnore + @JoinColumn(name = "user_id", nullable = false) + private User user; + + @Column(name = "start_date") + private LocalDateTime startDate; + + @Column(name = "end_date") + private LocalDateTime endDate; + + @Column(name = "last_seen") + private LocalDateTime lastSeen; +} diff --git a/src/main/java/com/ddf/vodsystem/entities/User.java b/src/main/java/com/ddf/vodsystem/entities/User.java index f8a5455..1d7bf69 100644 --- a/src/main/java/com/ddf/vodsystem/entities/User.java +++ b/src/main/java/com/ddf/vodsystem/entities/User.java @@ -34,5 +34,8 @@ public class User { @Column(name = "created_at") private LocalDateTime createdAt; + + @Column(name = "stream_key") + private String streamKey; } diff --git a/src/main/java/com/ddf/vodsystem/repositories/StreamRepository.java b/src/main/java/com/ddf/vodsystem/repositories/StreamRepository.java new file mode 100644 index 0000000..ecfb88e --- /dev/null +++ b/src/main/java/com/ddf/vodsystem/repositories/StreamRepository.java @@ -0,0 +1,9 @@ +package com.ddf.vodsystem.repositories; + +import com.ddf.vodsystem.entities.Stream; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface StreamRepository extends JpaRepository { +} diff --git a/src/main/java/com/ddf/vodsystem/repositories/UserRepository.java b/src/main/java/com/ddf/vodsystem/repositories/UserRepository.java index 50262d6..3a978b7 100644 --- a/src/main/java/com/ddf/vodsystem/repositories/UserRepository.java +++ b/src/main/java/com/ddf/vodsystem/repositories/UserRepository.java @@ -11,4 +11,7 @@ import java.util.Optional; public interface UserRepository extends JpaRepository { @Query("SELECT u FROM User u WHERE u.googleId = ?1") Optional findByGoogleId(String googleId); + + @Query("SELECT u FROM User u WHERE u.streamKey = ?1") + Optional findByStreamKey(String streamKey); } diff --git a/src/main/java/com/ddf/vodsystem/services/StreamService.java b/src/main/java/com/ddf/vodsystem/services/StreamService.java new file mode 100644 index 0000000..dc6e471 --- /dev/null +++ b/src/main/java/com/ddf/vodsystem/services/StreamService.java @@ -0,0 +1,24 @@ +package com.ddf.vodsystem.services; + +import com.ddf.vodsystem.entities.User; +import com.ddf.vodsystem.repositories.StreamRepository; + +public class StreamService { + private StreamRepository streamRepository; + + public StreamService(StreamRepository streamRepository) { + this.streamRepository = streamRepository; + } + + public void startStream(User user) { + + } + + public void endStream(User user) { + + } + + public void heartbeatStream(User user) { + + } +} diff --git a/src/main/java/com/ddf/vodsystem/services/UserService.java b/src/main/java/com/ddf/vodsystem/services/UserService.java index 5c63d80..ce9f586 100644 --- a/src/main/java/com/ddf/vodsystem/services/UserService.java +++ b/src/main/java/com/ddf/vodsystem/services/UserService.java @@ -67,6 +67,10 @@ public class UserService { return jwtService.generateToken(user.getId()); } + public Optional getUserByStreamKey(String streamKey) { + return userRepository.findByStreamKey(streamKey); + } + private User createOrUpdateUser(User user) { Optional existingUser = userRepository.findByGoogleId(user.getGoogleId()); diff --git a/src/main/resources/db/schema.sql b/src/main/resources/db/schema.sql index d8b1362..076c547 100644 --- a/src/main/resources/db/schema.sql +++ b/src/main/resources/db/schema.sql @@ -9,8 +9,20 @@ CREATE TABLE IF NOT EXISTS users ( name VARCHAR(100) NOT NULL, profile_picture_url VARCHAR(255), role INTEGER DEFAULT 0, - created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP - ); + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + stream_key VARCHAR(64) NOT NULL +); + +CREATE TABLE IF NOT EXISTS streams ( + id BIGSERIAL PRIMARY KEY, + user_id BIGSERIAL, + start_time TIMESTAMPTZ DEFAULT NOW(), + end_time TIMESTAMPTZ DEFAULT NULL, + last_seen TIMESTAMPTZ DEFAULT NULL + + + FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE +) CREATE TABLE IF NOT EXISTS clips ( id BIGSERIAL PRIMARY KEY,