Refactor code structure for improved readability and maintainability

This commit is contained in:
2025-04-28 00:52:40 +02:00
parent b6e0080caa
commit 93026436a9
48 changed files with 2116 additions and 126 deletions

View File

@@ -0,0 +1,77 @@
@startuml Modèles de données
class Project {
+id: integer
+name: string
+description: string
+start_date: date
+status: integer
+getAllProjects()
+getProjectById(id)
+createProject(name, description, startDate, status)
+updateProject(id, updates)
+updateProjectStatus(id, status)
+deleteProject(id)
+findCurrentRenderingProject()
+findStoppingProject()
}
class Measurement {
+id: integer
+project_id: integer
+timestamp: datetime
+path: string
+temperature: float
+humidity: float
+order_id: integer
+getAllMeasurements()
+getMeasurementById(id)
+getMeasurementByProjectAndOrderId(projectId, orderId)
+getMeasurementsByProjectId(projectId)
+createMeasurement(projectId, timestamp, path, temperature, humidity, orderId)
+updateMeasurement(id, updates)
+deleteMeasurement(id)
+getNextOrderId(projectId)
}
class Video {
+id: integer
+project_id: integer
+measurement_ids: string
+name: string
+resolution: string
+duration: integer
+status: integer
+progress: float
+video_file: string
+started_at: datetime
+updated_at: datetime
+eta: float
+getAllVideos()
+getVideoById(id)
+getVideosByProjectId(projectId)
+createVideo(projectId, measurementIds, name, resolution, duration, status)
+updateVideo(id, updates)
+updateVideoFilePath(id, videoFile)
+updateVideoStatus(id, status)
+deleteVideo(id)
+getUnfinishedVideos()
+updateVideoProgress(id, progress, eta)
}
class Camera {
+id: integer
+interval: integer
+maintenance: integer
+active: integer
+getCamera()
+updateCamera(id, updates)
+deleteCamera(id)
+initializeCamera()
}
Project "1" -- "0..*" Measurement : possède >
Project "1" -- "0..*" Video : possède >
Measurement "1..*" -- "0..*" Video : utilisée dans >
@enduml

View File

@@ -0,0 +1,62 @@
@startuml Architecture MVC
package "Controllers" {
[ProjectController]
[MeasurementController]
[VideoController]
[ImageController]
[CameraController]
}
package "Models" {
[Project]
[Measurement]
[Video]
[Camera]
[DatabaseManager]
}
package "Routes" {
[projectRoutes]
[measurementRoutes]
[videoRoutes]
[imageRoutes]
[cameraRoutes]
[index]
}
package "Services" {
[StorageService]
[VideoService]
}
package "Utils" {
[errorHandler]
}
package "Database" {
[connection]
}
package "Config" {
[config]
}
cloud "Client" {
[Frontend]
}
[Frontend] --> [Routes]
[Routes] --> [Controllers]
[Controllers] --> [Models]
[Controllers] --> [Services]
[Models] --> [Database]
[Services] --> [Models]
[Controllers] --> [Utils]
[Models] --> [Utils]
[Services] --> [Utils]
[Models] --> [Config]
[Services] --> [Config]
[Controllers] --> [Config]
@enduml

View File

@@ -0,0 +1,39 @@
@startuml Création de vidéo
actor Client
participant "videoRoutes" as Routes
participant "VideoController" as Controller
participant "Video" as Model
participant "Measurement" as MeasurementModel
participant "VideoService" as Service
participant "FFmpeg" as FFmpeg
database Database
Client -> Routes: POST /videos
Routes -> Controller: createVideo(req, res)
Controller -> Model: createVideo(project_id, measurement_ids, name, resolution, duration)
Model -> Database: INSERT INTO videos
Database --> Model: video data
Model --> Controller: video object
Controller -> Controller: getMeasurementPathList(measurement_ids, project_id)
Controller -> MeasurementModel: getMeasurementByProjectAndOrderId(projectId, orderId)
MeasurementModel -> Database: SELECT * FROM measurements
Database --> MeasurementModel: measurement data
MeasurementModel --> Controller: measurement object with path
Controller -> Service: createVideoFromImages(project_id, pathList, duration, video_id, resWidth, resHeight)
Service -> FFmpeg: spawn('ffmpeg', ffmpegArgs)
Service -> Model: updateVideo(videoId, {status: rendering, progress: 0})
Model -> Database: UPDATE videos SET status = rendering, progress = 0
FFmpeg --> Service: stderr progress events
Service -> Model: updateVideoProgress(videoId, progress, eta)
Model -> Database: UPDATE videos SET progress = X, eta = Y
FFmpeg --> Service: process complete
Service -> Model: updateVideo(videoId, {status: completed, progress: 100})
Model -> Database: UPDATE videos SET status = completed, progress = 100
Service --> Controller: videoFile path
Controller --> Routes: { message: success, id: video.id }
Routes --> Client: 200 OK - JSON Response
@enduml

View File

@@ -0,0 +1,34 @@
@startuml Cas d'utilisation
left to right direction
actor "Utilisateur" as User
actor "Caméra" as Camera
rectangle "Timelapse Backend" {
usecase "Gérer les projets" as UC1
usecase "Configurer la caméra" as UC2
usecase "Capturer des images" as UC3
usecase "Créer des vidéos" as UC4
usecase "Visualiser les images" as UC5
usecase "Visualiser les vidéos" as UC6
usecase "Démarrer une capture" as UC7
usecase "Arrêter une capture" as UC8
usecase "Uploader une image et des mesures" as UC9
UC1 ..> UC7 : <<include>>
UC1 ..> UC8 : <<include>>
UC2 ..> UC7 : <<extend>>
UC2 ..> UC8 : <<extend>>
UC3 ..> UC9 : <<include>>
UC4 ..> UC5 : <<include>>
}
User --> UC1
User --> UC2
User --> UC4
User --> UC5
User --> UC6
Camera --> UC3
Camera --> UC9
@enduml

View File

@@ -0,0 +1,41 @@
@startuml Déploiement
node "Client Device" {
[Web Browser] as Browser
}
node "Docker Environment" {
node "timelapse-api" {
[Express Server] as Server
[Node.js Runtime] as Node
[FFmpeg] as FFmpeg
}
database "timelapse-db" {
[PostgreSQL] as DB
}
folder "Volumes" {
folder "storage/" {
[Project Images]
[Generated Videos]
}
}
}
node "Camera Device" {
[Camera Software] as CamSoftware
[Sensors] as Sensors
}
Browser --> Server: HTTP/REST
CamSoftware --> Server: HTTP/REST
Server --> DB: SQL Queries
Server --> FFmpeg: Process Spawn
FFmpeg --> [Project Images]: Read
FFmpeg --> [Generated Videos]: Write
Server --> [Project Images]: Read/Write
Server --> [Generated Videos]: Read
Sensors --> CamSoftware: Temperature/\nHumidity Data
@enduml