From 48a13a5fccfbb39c9b307cca886abf50a3d849c0 Mon Sep 17 00:00:00 2001 From: AlbertoML1999 Date: Fri, 15 May 2026 20:44:23 +0200 Subject: [PATCH 1/5] feat: update documentation with new functionalities and sections required for the version 0.1 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Enhanced the detailed functionalities documentation to include implementation status (✅ for implemented, ⏳ for in progress) for various user roles. - Updated descriptions for anonymous, registered, and administrator users to reflect current capabilities and features. - Added new sections for execution guide and functionalities, detailing how to run the application using Docker and the available features for different user types. - Removed outdated development guide content and replaced it with a more concise execution guide. --- README.md | 31 +- ...entsNow_Collection.postman_collection.json | 3748 ++++++++++++++++- docs/detailed_functionalities.md | 58 +- docs/development_guide.md | 337 -- docs/execution.md | 103 + docs/functionalities.md | 107 + 6 files changed, 3826 insertions(+), 558 deletions(-) create mode 100644 docs/execution.md create mode 100644 docs/functionalities.md diff --git a/README.md b/README.md index 5aa7127..47cc6e1 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,13 @@ GoEventsNow aims to provide a complete, modern and user-centered system that sim *GoEventsNow: Your Next Event, Now, Simplified.* ✨ +--- +## *Version 0.1 - Overview* + +> The current version of the project is a minimum viable product (MVP) that includes the basic functionalities of the application, such as user registration, login and logout, event and participant browsing, detailed event and participant pages. Registered users can also purchase tickets and edit their personal information from their personal page, where they can also view the tickets they have purchased. Admin users have additional privileges to manage events and participants, including creating, editing and deleting them. Finally, the application allows registered users to add and delete profile images, while administrators can manage images for events and participants. These images are stored in the database. + +> In addition, this version includes Docker deployment and continuous delivery support. The application is packaged as a single Docker image containing both the Spring Boot backend and the Angular frontend, coordinated with a MySQL database through Docker Compose. The image and the Docker Compose artifact are published in DockerHub, and GitHub Actions workflows automate development builds, manual builds and release publication. + --- ## 🖥️ *Screen Mockups* @@ -26,20 +33,34 @@ GoEventsNow aims to provide a complete, modern and user-centered system that sim --- > [!WARNING] -> At this stage, only the functional and technical objectives of the application have been defined. Although implementation has started, the application is not yet functional. +> At this stage, the implementation has started and the application is functional. Despite this, the design and the implementation are still in progress, so the final version may differ from the content added in this version. > > 📁 *Repository: [GoEventsNow on GitHub](https://github.com/codeurjc-students/2025-GoEventsNow)* --- +### 🎥 Demo Video + +> In the following video, you can see a demonstration of the current functionalities implemented in the 0.1.0 version of GoEventsNow. The video shows the main features of the application, including event browsing, participant browsing, event and participant details, user registration and login, ticket purchase, user profile management, and administrator functionalities for managing events and participants. The video separates the different user roles, showing the experience of an anonymous user, a registered user and an administrator user. + +[Watch the demo of GoEventsNow for version 0.1.0](VIDEO_URL) +--- + +## *Future Functionalities* + +> In future stages, GoEventsNow will expand the user experience by introducing advanced multi-filter search, a full review system, sales statistics charts, an integrated help/FAQ center, and social interaction features such as favorites and participant following. In more advanced stages, it will evolve with personalized recommendations, PDF digital ticketing, automated email services, geolocation maps, real-time notifications via WebSocket, simulated payment processing, and AI-based sentiment analysis to evaluate user satisfaction. + +--- ## 📑 Index 1. 🎯 **[Objectives](docs/objectives.md)** 2. 🛠️ **[Methodology](docs/methodology.md)** 3. ⚙️ **[Detailed Functionalities](docs/detailed_functionalities.md)** -4. 🔍 **[Analysis](docs/analysis.md)** -5. 📈 **[Tracking](docs/tracking.md)** -6. 👨‍💻 **[Author](docs/author.md)** -7. 📘 **[Development Guide](docs/development_guide.md)** +4. 📊 **[Execution](docs/execution.md)** +5. 🔍 **[Analysis](docs/analysis.md)** +6. 📋 **[Functionalities](docs/functionalities.md)** +7. 📈 **[Tracking](docs/tracking.md)** +8. 👨‍💻 **[Author](docs/author.md)** +9. 📘 **[Development Guide](docs/development_guide.md)** diff --git a/docs/GoEventsNow_Collection.postman_collection.json b/docs/GoEventsNow_Collection.postman_collection.json index 5eafd92..8588f2a 100644 --- a/docs/GoEventsNow_Collection.postman_collection.json +++ b/docs/GoEventsNow_Collection.postman_collection.json @@ -1,192 +1,3560 @@ { - "info": { - "_postman_id": "e13e54cf-0cb5-4916-b342-46d7feb80013", - "name": "GoEventsNow_Collection", - "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json", - "_exporter_id": "49191128", - "_collection_link": "https://albertoml1999-4400337.postman.co/workspace/7c33c509-b864-44b6-858d-ddc68f77d47d/collection/49191128-e13e54cf-0cb5-4916-b342-46d7feb80013?action=share&source=collection_link&creator=49191128" - }, - "item": [ - { - "name": "Post Request", - "request": { - "method": "POST", - "header": [], - "body": { - "mode": "raw", - "raw": "{\r\n \"title\": \"Cocina Virtual 3.0\",\r\n \"category\": \"Gastronomía\",\r\n \"location\": \"Parla, Madrid\",\r\n \"date\": \"28-10-2028\"\r\n}", - "options": { - "raw": { - "language": "json" - } - } - }, - "url": { - "raw": "{{baseURL}}/api/v1/events/", - "host": [ - "{{baseURL}}" - ], - "path": [ - "api", - "v1", - "events", - "" - ] - } - }, - "response": [ - { - "name": "Post Request", - "originalRequest": { - "method": "POST", - "header": [], - "body": { - "mode": "raw", - "raw": "{\r\n \"title\": \"Cocina Virtual 3.0\",\r\n \"category\": \"Gastronomía\",\r\n \"location\": \"Parla, Madrid\",\r\n \"date\": \"28-10-2028\"\r\n}", - "options": { - "raw": { - "language": "json" - } - } - }, - "url": { - "raw": "/api/v1/events/", - "path": [ - "api", - "v1", - "events", - "" - ] - } - }, - "status": "Created", - "code": 201, - "_postman_previewlanguage": "", - "header": [ - { - "key": "Vary", - "value": "Origin" - }, - { - "key": "Vary", - "value": "Access-Control-Request-Method" - }, - { - "key": "Vary", - "value": "Access-Control-Request-Headers" - }, - { - "key": "Location", - "value": "http://localhost:8080/api/v1/events/4" - }, - { - "key": "Content-Type", - "value": "application/json" - }, - { - "key": "Transfer-Encoding", - "value": "chunked" - }, - { - "key": "Date", - "value": "Thu, 05 Feb 2026 10:18:17 GMT" - }, - { - "key": "Keep-Alive", - "value": "timeout=60" - }, - { - "key": "Connection", - "value": "keep-alive" - } - ], - "cookie": [], - "body": "{\n \"id\": 4,\n \"title\": \"Cocina Virtual 3.0\",\n \"category\": \"Gastronomía\",\n \"location\": \"Parla, Madrid\",\n \"date\": \"28-10-2028\"\n}" - } - ] - }, - { - "name": "Get Request", - "request": { - "method": "GET", - "header": [], - "url": { - "raw": "{{baseURL}}/api/v1/events/", - "host": [ - "{{baseURL}}" - ], - "path": [ - "api", - "v1", - "events", - "" - ] - } - }, - "response": [ - { - "name": "Get Request", - "originalRequest": { - "method": "GET", - "header": [], - "url": { - "raw": "/api/v1/events/", - "path": [ - "api", - "v1", - "events", - "" - ] - } - }, - "status": "OK", - "code": 200, - "_postman_previewlanguage": "", - "header": [ - { - "key": "Vary", - "value": "Origin" - }, - { - "key": "Vary", - "value": "Access-Control-Request-Method" - }, - { - "key": "Vary", - "value": "Access-Control-Request-Headers" - }, - { - "key": "Content-Type", - "value": "application/json" - }, - { - "key": "Transfer-Encoding", - "value": "chunked" - }, - { - "key": "Date", - "value": "Thu, 05 Feb 2026 10:20:39 GMT" - }, - { - "key": "Keep-Alive", - "value": "timeout=60" - }, - { - "key": "Connection", - "value": "keep-alive" - } - ], - "cookie": [], - "body": "[\n {\n \"id\": 1,\n \"title\": \"Taller de Spring Boot 4.0\",\n \"category\": \"Tecnología\",\n \"location\": \"Fuenlabrada, Madrid\",\n \"date\": \"15-03-2026\"\n },\n {\n \"id\": 2,\n \"title\": \"Exposición Arte\",\n \"category\": \"Cultura\",\n \"location\": \"Barcelona\",\n \"date\": \"12-02-2026\"\n },\n {\n \"id\": 3,\n \"title\": \"Torneo de Baloncesto\",\n \"category\": \"Deportes\",\n \"location\": \"Getafe, Madrid\",\n \"date\": \"02-08-2026\"\n },\n {\n \"id\": 4,\n \"title\": \"Cocina Virtual 3.0\",\n \"category\": \"Gastronomía\",\n \"location\": \"Parla, Madrid\",\n \"date\": \"28-10-2028\"\n }\n]" - } - ] - } - ], - "variable": [ - { - "key": "baseURL", - "value": "", - "type": "default" - } - ] + "info": { + "_postman_id": "e13e54cf-0cb5-4916-b342-46d7feb80013", + "name": "GoEventsNow_Collection", + "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json", + "_exporter_id": "49191128", + "_collection_link": "https://go.postman.co/collection/49191128-e13e54cf-0cb5-4916-b342-46d7feb80013?source=collection_link" + }, + "item": [ + { + "name": "Login Request", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\r\n \"username\": \"admin\",\r\n \"password\": \"adminpass\"\r\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "https://localhost:8443/api/v1/auth/login", + "protocol": "https", + "host": [ + "localhost" + ], + "port": "8443", + "path": [ + "api", + "v1", + "auth", + "login" + ] + } + }, + "response": [ + { + "name": "Login Request", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\r\n \"username\": \"admin\",\r\n \"password\": \"adminpass\"\r\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "https://localhost:8443/api/v1/auth/login", + "protocol": "https", + "host": [ + "localhost" + ], + "port": "8443", + "path": [ + "api", + "v1", + "auth", + "login" + ] + } + }, + "status": "OK", + "code": 200, + "_postman_previewlanguage": null, + "header": [ + { + "key": "Set-Cookie", + "value": "AuthToken=eyJhbGciOiJIUzI1NiJ9.eyJyb2xlcyI6W3siYXV0aG9yaXR5IjoiUk9MRV9BRE1JTiJ9LHsiYXV0aG9yaXR5IjoiUk9MRV9VU0VSIn1dLCJ0eXBlIjoiQUNDRVNTIiwic3ViIjoiYWRtaW4iLCJpYXQiOjE3Nzg4MzIxNjEsImV4cCI6MTc3ODgzMjQ2MX0.HlFeQgku9eOn_LJYlM1LqyJcXDfaC49ZjIejnJp-7Kc; Max-Age=300; Expires=Fri, 15 May 2026 08:07:41 GMT; Path=/; HttpOnly" + }, + { + "key": "Set-Cookie", + "value": "RefreshToken=eyJhbGciOiJIUzI1NiJ9.eyJyb2xlcyI6W3siYXV0aG9yaXR5IjoiUk9MRV9BRE1JTiJ9LHsiYXV0aG9yaXR5IjoiUk9MRV9VU0VSIn1dLCJ0eXBlIjoiUkVGUkVTSCIsInN1YiI6ImFkbWluIiwiaWF0IjoxNzc4ODMyMTYxLCJleHAiOjE3Nzk0MzY5NjF9.VRwBXAekEfm_ZUtV3ppA4ZBvGUTjuS3jNrpHKeP1_vY; Max-Age=604800; Expires=Fri, 22 May 2026 08:02:41 GMT; Path=/; HttpOnly" + }, + { + "key": "X-Content-Type-Options", + "value": "nosniff" + }, + { + "key": "X-XSS-Protection", + "value": "0" + }, + { + "key": "Cache-Control", + "value": "no-cache, no-store, max-age=0, must-revalidate" + }, + { + "key": "Pragma", + "value": "no-cache" + }, + { + "key": "Expires", + "value": "0" + }, + { + "key": "Strict-Transport-Security", + "value": "max-age=31536000 ; includeSubDomains" + }, + { + "key": "X-Frame-Options", + "value": "DENY" + }, + { + "key": "Content-Type", + "value": "application/json" + }, + { + "key": "Transfer-Encoding", + "value": "chunked" + }, + { + "key": "Date", + "value": "Fri, 15 May 2026 08:02:41 GMT" + }, + { + "key": "Keep-Alive", + "value": "timeout=60" + }, + { + "key": "Connection", + "value": "keep-alive" + } + ], + "cookie": [], + "body": "{\n \"status\": \"SUCCESS\",\n \"message\": \"Auth successful. Tokens are created in cookie.\",\n \"error\": null\n}" + } + ] + }, + { + "name": "Register Request", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "formdata", + "formdata": [ + { + "key": "username", + "value": "newUser", + "type": "text", + "uuid": "2a2b32c0-d266-4873-ace4-6cf9ca133a21" + }, + { + "key": "fullname", + "value": "newUser", + "type": "text", + "uuid": "453edfc8-c7e9-4c6f-8c43-ba2641ec792d" + }, + { + "key": "email", + "value": "newUser@gmail.com", + "type": "text", + "uuid": "834cb017-2616-4bbe-b3b7-85ae8fdf6a37" + }, + { + "key": "password", + "value": "newUser", + "type": "text", + "uuid": "9147939c-3c9b-48a4-a530-21969fa99b8f" + }, + { + "key": "phone", + "value": "123456789", + "type": "text", + "uuid": "27e30a29-c320-4811-b1f3-3495f33d4b02" + } + ] + }, + "url": { + "raw": "https://localhost:8443/api/v1/auth/register", + "protocol": "https", + "host": [ + "localhost" + ], + "port": "8443", + "path": [ + "api", + "v1", + "auth", + "register" + ] + } + }, + "response": [ + { + "name": "Register Request", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "formdata", + "formdata": [ + { + "key": "username", + "value": "newUser", + "type": "text", + "uuid": "2a2b32c0-d266-4873-ace4-6cf9ca133a21" + }, + { + "key": "fullname", + "value": "newUser", + "type": "text", + "uuid": "453edfc8-c7e9-4c6f-8c43-ba2641ec792d" + }, + { + "key": "email", + "value": "newUser@gmail.com", + "type": "text", + "uuid": "834cb017-2616-4bbe-b3b7-85ae8fdf6a37" + }, + { + "key": "password", + "value": "newUser", + "type": "text", + "uuid": "9147939c-3c9b-48a4-a530-21969fa99b8f" + }, + { + "key": "phone", + "value": "123456789", + "type": "text", + "uuid": "27e30a29-c320-4811-b1f3-3495f33d4b02" + } + ], + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "https://localhost:8443/api/v1/auth/register", + "protocol": "https", + "host": [ + "localhost" + ], + "port": "8443", + "path": [ + "api", + "v1", + "auth", + "register" + ] + } + }, + "status": "Created", + "code": 201, + "_postman_previewlanguage": null, + "header": [ + { + "key": "Location", + "value": "https://localhost:8443/api/v1/users/3" + }, + { + "key": "X-Content-Type-Options", + "value": "nosniff" + }, + { + "key": "X-XSS-Protection", + "value": "0" + }, + { + "key": "Cache-Control", + "value": "no-cache, no-store, max-age=0, must-revalidate" + }, + { + "key": "Pragma", + "value": "no-cache" + }, + { + "key": "Expires", + "value": "0" + }, + { + "key": "Strict-Transport-Security", + "value": "max-age=31536000 ; includeSubDomains" + }, + { + "key": "X-Frame-Options", + "value": "DENY" + }, + { + "key": "Content-Type", + "value": "application/json" + }, + { + "key": "Transfer-Encoding", + "value": "chunked" + }, + { + "key": "Date", + "value": "Fri, 15 May 2026 08:06:17 GMT" + }, + { + "key": "Keep-Alive", + "value": "timeout=60" + }, + { + "key": "Connection", + "value": "keep-alive" + } + ], + "cookie": [], + "body": "{\n \"status\": \"SUCCESS\",\n \"message\": \"User registered\",\n \"error\": null\n}" + } + ] + }, + { + "name": "Refresh Request", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "formdata", + "formdata": [ + { + "key": "username", + "value": "newUser", + "type": "text", + "uuid": "2a2b32c0-d266-4873-ace4-6cf9ca133a21" + }, + { + "key": "fullname", + "value": "newUser", + "type": "text", + "uuid": "453edfc8-c7e9-4c6f-8c43-ba2641ec792d" + }, + { + "key": "email", + "value": "newUser@gmail.com", + "type": "text", + "uuid": "834cb017-2616-4bbe-b3b7-85ae8fdf6a37" + }, + { + "key": "password", + "value": "newUser", + "type": "text", + "uuid": "9147939c-3c9b-48a4-a530-21969fa99b8f" + }, + { + "key": "phone", + "value": "123456789", + "type": "text", + "uuid": "27e30a29-c320-4811-b1f3-3495f33d4b02" + } + ] + }, + "url": { + "raw": "https://localhost:8443/api/v1/auth/refresh", + "protocol": "https", + "host": [ + "localhost" + ], + "port": "8443", + "path": [ + "api", + "v1", + "auth", + "refresh" + ] + } + }, + "response": [ + { + "name": "Refresh Request", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "formdata", + "formdata": [ + { + "key": "username", + "value": "newUser", + "type": "text", + "uuid": "2a2b32c0-d266-4873-ace4-6cf9ca133a21" + }, + { + "key": "fullname", + "value": "newUser", + "type": "text", + "uuid": "453edfc8-c7e9-4c6f-8c43-ba2641ec792d" + }, + { + "key": "email", + "value": "newUser@gmail.com", + "type": "text", + "uuid": "834cb017-2616-4bbe-b3b7-85ae8fdf6a37" + }, + { + "key": "password", + "value": "newUser", + "type": "text", + "uuid": "9147939c-3c9b-48a4-a530-21969fa99b8f" + }, + { + "key": "phone", + "value": "123456789", + "type": "text", + "uuid": "27e30a29-c320-4811-b1f3-3495f33d4b02" + } + ] + }, + "url": { + "raw": "https://localhost:8443/api/v1/auth/refresh", + "protocol": "https", + "host": [ + "localhost" + ], + "port": "8443", + "path": [ + "api", + "v1", + "auth", + "refresh" + ] + } + }, + "status": "OK", + "code": 200, + "_postman_previewlanguage": null, + "header": [ + { + "key": "Set-Cookie", + "value": "AuthToken=eyJhbGciOiJIUzI1NiJ9.eyJyb2xlcyI6W3siYXV0aG9yaXR5IjoiUk9MRV9BRE1JTiJ9LHsiYXV0aG9yaXR5IjoiUk9MRV9VU0VSIn1dLCJ0eXBlIjoiQUNDRVNTIiwic3ViIjoiYWRtaW4iLCJpYXQiOjE3Nzg4MzI0MTMsImV4cCI6MTc3ODgzMjcxM30.ElH9G0i8OvqrSmMl0SSMBAddrpEK3KGytV86BS81w_E; Max-Age=300; Expires=Fri, 15 May 2026 08:11:53 GMT; Path=/; HttpOnly" + }, + { + "key": "X-Content-Type-Options", + "value": "nosniff" + }, + { + "key": "X-XSS-Protection", + "value": "0" + }, + { + "key": "Cache-Control", + "value": "no-cache, no-store, max-age=0, must-revalidate" + }, + { + "key": "Pragma", + "value": "no-cache" + }, + { + "key": "Expires", + "value": "0" + }, + { + "key": "Strict-Transport-Security", + "value": "max-age=31536000 ; includeSubDomains" + }, + { + "key": "X-Frame-Options", + "value": "DENY" + }, + { + "key": "Content-Type", + "value": "application/json" + }, + { + "key": "Transfer-Encoding", + "value": "chunked" + }, + { + "key": "Date", + "value": "Fri, 15 May 2026 08:06:53 GMT" + }, + { + "key": "Keep-Alive", + "value": "timeout=60" + }, + { + "key": "Connection", + "value": "keep-alive" + } + ], + "cookie": [], + "body": "{\n \"status\": \"SUCCESS\",\n \"message\": \"Auth successful. Tokens are created in cookie.\",\n \"error\": null\n}" + } + ] + }, + { + "name": "Logout Request", + "request": { + "method": "POST", + "header": [], + "url": { + "raw": "https://localhost:8443/api/v1/auth/logout", + "protocol": "https", + "host": [ + "localhost" + ], + "port": "8443", + "path": [ + "api", + "v1", + "auth", + "logout" + ] + } + }, + "response": [ + { + "name": "Logout Request", + "originalRequest": { + "method": "POST", + "header": [], + "url": { + "raw": "https://localhost:8443/api/v1/auth/logout", + "protocol": "https", + "host": [ + "localhost" + ], + "port": "8443", + "path": [ + "api", + "v1", + "auth", + "logout" + ] + } + }, + "status": "OK", + "code": 200, + "_postman_previewlanguage": null, + "header": [ + { + "key": "Set-Cookie", + "value": "AuthToken=; Max-Age=0; Expires=Thu, 01 Jan 1970 00:00:10 GMT; Path=/; HttpOnly" + }, + { + "key": "Set-Cookie", + "value": "RefreshToken=; Max-Age=0; Expires=Thu, 01 Jan 1970 00:00:10 GMT; Path=/; HttpOnly" + }, + { + "key": "X-Content-Type-Options", + "value": "nosniff" + }, + { + "key": "X-XSS-Protection", + "value": "0" + }, + { + "key": "Cache-Control", + "value": "no-cache, no-store, max-age=0, must-revalidate" + }, + { + "key": "Pragma", + "value": "no-cache" + }, + { + "key": "Expires", + "value": "0" + }, + { + "key": "Strict-Transport-Security", + "value": "max-age=31536000 ; includeSubDomains" + }, + { + "key": "X-Frame-Options", + "value": "DENY" + }, + { + "key": "Content-Type", + "value": "application/json" + }, + { + "key": "Transfer-Encoding", + "value": "chunked" + }, + { + "key": "Date", + "value": "Fri, 15 May 2026 08:07:16 GMT" + }, + { + "key": "Keep-Alive", + "value": "timeout=60" + }, + { + "key": "Connection", + "value": "keep-alive" + } + ], + "cookie": [], + "body": "{\n \"status\": \"SUCCESS\",\n \"message\": \"logout successfully\",\n \"error\": null\n}" + } + ] + }, + { + "name": "UserMe Request", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "https://localhost:8443/api/v1/users/me", + "protocol": "https", + "host": [ + "localhost" + ], + "port": "8443", + "path": [ + "api", + "v1", + "users", + "me" + ] + } + }, + "response": [ + { + "name": "UserMe Request", + "originalRequest": { + "method": "GET", + "header": [], + "url": { + "raw": "https://localhost:8443/api/v1/users/me", + "protocol": "https", + "host": [ + "localhost" + ], + "port": "8443", + "path": [ + "api", + "v1", + "users", + "me" + ] + } + }, + "status": "OK", + "code": 200, + "_postman_previewlanguage": null, + "header": [ + { + "key": "X-Content-Type-Options", + "value": "nosniff" + }, + { + "key": "X-XSS-Protection", + "value": "0" + }, + { + "key": "Cache-Control", + "value": "no-cache, no-store, max-age=0, must-revalidate" + }, + { + "key": "Pragma", + "value": "no-cache" + }, + { + "key": "Expires", + "value": "0" + }, + { + "key": "Strict-Transport-Security", + "value": "max-age=31536000 ; includeSubDomains" + }, + { + "key": "X-Frame-Options", + "value": "DENY" + }, + { + "key": "Content-Type", + "value": "application/json" + }, + { + "key": "Transfer-Encoding", + "value": "chunked" + }, + { + "key": "Date", + "value": "Fri, 15 May 2026 08:08:19 GMT" + }, + { + "key": "Keep-Alive", + "value": "timeout=60" + }, + { + "key": "Connection", + "value": "keep-alive" + } + ], + "cookie": [], + "body": "{\n \"id\": 2,\n \"fullname\": \"Administrator\",\n \"username\": \"admin\",\n \"phone\": 987654321,\n \"email\": \"admin@gmail.com\",\n \"password\": \"$2a$10$6WQnknR4sQj7BfE8o4nkpuyCOiqtUko/foxD.KptmCux2AcN53YDG\",\n \"numTicketsBought\": null,\n \"favoriteGenre\": \"None\",\n \"profileImage\": false,\n \"tickets\": [],\n \"roles\": [\n \"USER\",\n \"ADMIN\"\n ]\n}" + } + ] + }, + { + "name": "UserExists Request", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "https://localhost:8443/api/v1/users/exists?username=admin", + "protocol": "https", + "host": [ + "localhost" + ], + "port": "8443", + "path": [ + "api", + "v1", + "users", + "exists" + ], + "query": [ + { + "key": "username", + "value": "admin" + } + ] + } + }, + "response": [ + { + "name": "UserExists Request", + "originalRequest": { + "method": "GET", + "header": [], + "url": { + "raw": "https://localhost:8443/api/v1/users/exists?username=admin", + "protocol": "https", + "host": [ + "localhost" + ], + "port": "8443", + "path": [ + "api", + "v1", + "users", + "exists" + ], + "query": [ + { + "key": "username", + "value": "admin" + } + ] + } + }, + "status": "OK", + "code": 200, + "_postman_previewlanguage": null, + "header": [ + { + "key": "X-Content-Type-Options", + "value": "nosniff" + }, + { + "key": "X-XSS-Protection", + "value": "0" + }, + { + "key": "Cache-Control", + "value": "no-cache, no-store, max-age=0, must-revalidate" + }, + { + "key": "Pragma", + "value": "no-cache" + }, + { + "key": "Expires", + "value": "0" + }, + { + "key": "Strict-Transport-Security", + "value": "max-age=31536000 ; includeSubDomains" + }, + { + "key": "X-Frame-Options", + "value": "DENY" + }, + { + "key": "Content-Type", + "value": "application/json" + }, + { + "key": "Transfer-Encoding", + "value": "chunked" + }, + { + "key": "Date", + "value": "Fri, 15 May 2026 08:09:14 GMT" + }, + { + "key": "Keep-Alive", + "value": "timeout=60" + }, + { + "key": "Connection", + "value": "keep-alive" + } + ], + "cookie": [], + "body": "true" + } + ] + }, + { + "name": "UserImage Request", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "https://localhost:8443/api/v1/users/2/image", + "protocol": "https", + "host": [ + "localhost" + ], + "port": "8443", + "path": [ + "api", + "v1", + "users", + "2", + "image" + ] + } + }, + "response": [] + }, + { + "name": "UserImage Request", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "formdata", + "formdata": [ + { + "key": "imageFile", + "type": "file", + "uuid": "7f397134-5322-407a-b8af-90abae284424", + "src": "postman-cloud:///1f15035b-4202-43d0-bcd4-f21c70e0bf6c" + } + ] + }, + "url": { + "raw": "https://localhost:8443/api/v1/users/2/image", + "protocol": "https", + "host": [ + "localhost" + ], + "port": "8443", + "path": [ + "api", + "v1", + "users", + "2", + "image" + ] + } + }, + "response": [ + { + "name": "UserImage Request", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "formdata", + "formdata": [ + { + "key": "imageFile", + "type": "file", + "uuid": "7f397134-5322-407a-b8af-90abae284424", + "src": "postman-cloud:///1f15035b-4202-43d0-bcd4-f21c70e0bf6c" + } + ] + }, + "url": { + "raw": "https://localhost:8443/api/v1/users/2/image", + "protocol": "https", + "host": [ + "localhost" + ], + "port": "8443", + "path": [ + "api", + "v1", + "users", + "2", + "image" + ] + } + }, + "status": "Created", + "code": 201, + "_postman_previewlanguage": null, + "header": [ + { + "key": "Location", + "value": "https://localhost:8443/api/v1/users/2/image" + }, + { + "key": "X-Content-Type-Options", + "value": "nosniff" + }, + { + "key": "X-XSS-Protection", + "value": "0" + }, + { + "key": "Cache-Control", + "value": "no-cache, no-store, max-age=0, must-revalidate" + }, + { + "key": "Pragma", + "value": "no-cache" + }, + { + "key": "Expires", + "value": "0" + }, + { + "key": "Strict-Transport-Security", + "value": "max-age=31536000 ; includeSubDomains" + }, + { + "key": "X-Frame-Options", + "value": "DENY" + }, + { + "key": "Content-Length", + "value": "0" + }, + { + "key": "Date", + "value": "Fri, 15 May 2026 08:13:41 GMT" + }, + { + "key": "Keep-Alive", + "value": "timeout=60" + }, + { + "key": "Connection", + "value": "keep-alive" + } + ], + "cookie": [], + "body": null + } + ] + }, + { + "name": "Edit UserImage Request", + "request": { + "method": "PUT", + "header": [], + "body": { + "mode": "formdata", + "formdata": [ + { + "key": "imageFile", + "type": "file", + "uuid": "7f397134-5322-407a-b8af-90abae284424", + "src": "postman-cloud:///1f150363-611f-4a80-9d70-3906c75d6a98" + } + ] + }, + "url": { + "raw": "https://localhost:8443/api/v1/users/2/image", + "protocol": "https", + "host": [ + "localhost" + ], + "port": "8443", + "path": [ + "api", + "v1", + "users", + "2", + "image" + ], + "query": [ + { + "key": "imageFile", + "value": null, + "type": "text", + "disabled": true + } + ] + } + }, + "response": [ + { + "name": "Edit UserImage Request", + "originalRequest": { + "method": "PUT", + "header": [], + "body": { + "mode": "formdata", + "formdata": [ + { + "key": "imageFile", + "type": "file", + "uuid": "7f397134-5322-407a-b8af-90abae284424", + "src": "postman-cloud:///1f150363-611f-4a80-9d70-3906c75d6a98" + } + ] + }, + "url": { + "raw": "https://localhost:8443/api/v1/users/2/image", + "protocol": "https", + "host": [ + "localhost" + ], + "port": "8443", + "path": [ + "api", + "v1", + "users", + "2", + "image" + ], + "query": [ + { + "key": "imageFile", + "value": null, + "type": "text", + "disabled": true + } + ] + } + }, + "status": "No Content", + "code": 204, + "_postman_previewlanguage": null, + "header": [ + { + "key": "X-Content-Type-Options", + "value": "nosniff" + }, + { + "key": "X-XSS-Protection", + "value": "0" + }, + { + "key": "Cache-Control", + "value": "no-cache, no-store, max-age=0, must-revalidate" + }, + { + "key": "Pragma", + "value": "no-cache" + }, + { + "key": "Expires", + "value": "0" + }, + { + "key": "Strict-Transport-Security", + "value": "max-age=31536000 ; includeSubDomains" + }, + { + "key": "X-Frame-Options", + "value": "DENY" + }, + { + "key": "Date", + "value": "Fri, 15 May 2026 08:15:22 GMT" + }, + { + "key": "Keep-Alive", + "value": "timeout=60" + }, + { + "key": "Connection", + "value": "keep-alive" + } + ], + "cookie": [], + "body": null + } + ] + }, + { + "name": "Delete UserImage Request", + "request": { + "method": "DELETE", + "header": [], + "body": { + "mode": "formdata", + "formdata": [ + { + "key": "imageFile", + "type": "file", + "uuid": "7f397134-5322-407a-b8af-90abae284424", + "src": "postman-cloud:///1f150363-611f-4a80-9d70-3906c75d6a98" + } + ] + }, + "url": { + "raw": "https://localhost:8443/api/v1/users/2/image", + "protocol": "https", + "host": [ + "localhost" + ], + "port": "8443", + "path": [ + "api", + "v1", + "users", + "2", + "image" + ], + "query": [ + { + "key": "imageFile", + "value": null, + "type": "text", + "disabled": true + } + ] + } + }, + "response": [ + { + "name": "Delete UserImage Request", + "originalRequest": { + "method": "DELETE", + "header": [], + "body": { + "mode": "formdata", + "formdata": [ + { + "key": "imageFile", + "type": "file", + "uuid": "7f397134-5322-407a-b8af-90abae284424", + "src": "postman-cloud:///1f150363-611f-4a80-9d70-3906c75d6a98" + } + ] + }, + "url": { + "raw": "https://localhost:8443/api/v1/users/2/image", + "protocol": "https", + "host": [ + "localhost" + ], + "port": "8443", + "path": [ + "api", + "v1", + "users", + "2", + "image" + ], + "query": [ + { + "key": "imageFile", + "value": null, + "type": "text", + "disabled": true + } + ] + } + }, + "status": "No Content", + "code": 204, + "_postman_previewlanguage": null, + "header": [ + { + "key": "X-Content-Type-Options", + "value": "nosniff" + }, + { + "key": "X-XSS-Protection", + "value": "0" + }, + { + "key": "Cache-Control", + "value": "no-cache, no-store, max-age=0, must-revalidate" + }, + { + "key": "Pragma", + "value": "no-cache" + }, + { + "key": "Expires", + "value": "0" + }, + { + "key": "Strict-Transport-Security", + "value": "max-age=31536000 ; includeSubDomains" + }, + { + "key": "X-Frame-Options", + "value": "DENY" + }, + { + "key": "Date", + "value": "Fri, 15 May 2026 08:16:04 GMT" + }, + { + "key": "Keep-Alive", + "value": "timeout=60" + }, + { + "key": "Connection", + "value": "keep-alive" + } + ], + "cookie": [], + "body": null + } + ] + }, + { + "name": "Edit User Request", + "request": { + "method": "PUT", + "header": [], + "body": { + "mode": "raw", + "raw": "{\r\n \"id\": 9007199254740991,\r\n \"fullname\": \"userUseruser\",\r\n \"username\": \"newEditUser\",\r\n \"phone\": 987654321,\r\n \"email\": \"uuusernew@gmail.com\",\r\n \"password\": \"string\",\r\n \"numTicketsBought\": 1073741824,\r\n \"favoriteGenre\": \"string\",\r\n \"profileImage\": true,\r\n \"tickets\": [\r\n {\r\n \"id\": 9007199254740991,\r\n \"ticketType\": \"string\",\r\n \"price\": 0.1,\r\n \"numTickets\": 1073741824,\r\n \"eventId\": 9007199254740991,\r\n \"userOwnerId\": 9007199254740991\r\n }\r\n ],\r\n \"roles\": [\r\n \"string\"\r\n ]\r\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "https://localhost:8443/api/v1/users/2", + "protocol": "https", + "host": [ + "localhost" + ], + "port": "8443", + "path": [ + "api", + "v1", + "users", + "2" + ], + "query": [ + { + "key": "imageFile", + "value": null, + "type": "text", + "disabled": true + } + ] + } + }, + "response": [ + { + "name": "Edit User", + "originalRequest": { + "method": "PUT", + "header": [], + "body": { + "mode": "raw", + "raw": "{\r\n \"id\": 9007199254740991,\r\n \"fullname\": \"userUseruser\",\r\n \"username\": \"newEditUser\",\r\n \"phone\": 987654321,\r\n \"email\": \"uuusernew@gmail.com\",\r\n \"password\": \"string\",\r\n \"numTicketsBought\": 1073741824,\r\n \"favoriteGenre\": \"string\",\r\n \"profileImage\": true,\r\n \"tickets\": [\r\n {\r\n \"id\": 9007199254740991,\r\n \"ticketType\": \"string\",\r\n \"price\": 0.1,\r\n \"numTickets\": 1073741824,\r\n \"eventId\": 9007199254740991,\r\n \"userOwnerId\": 9007199254740991\r\n }\r\n ],\r\n \"roles\": [\r\n \"string\"\r\n ]\r\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "https://localhost:8443/api/v1/users/2", + "protocol": "https", + "host": [ + "localhost" + ], + "port": "8443", + "path": [ + "api", + "v1", + "users", + "2" + ], + "query": [ + { + "key": "imageFile", + "value": null, + "type": "text", + "disabled": true + } + ] + } + }, + "status": "OK", + "code": 200, + "_postman_previewlanguage": null, + "header": [ + { + "key": "X-Content-Type-Options", + "value": "nosniff" + }, + { + "key": "X-XSS-Protection", + "value": "0" + }, + { + "key": "Cache-Control", + "value": "no-cache, no-store, max-age=0, must-revalidate" + }, + { + "key": "Pragma", + "value": "no-cache" + }, + { + "key": "Expires", + "value": "0" + }, + { + "key": "Strict-Transport-Security", + "value": "max-age=31536000 ; includeSubDomains" + }, + { + "key": "X-Frame-Options", + "value": "DENY" + }, + { + "key": "Content-Type", + "value": "application/json" + }, + { + "key": "Transfer-Encoding", + "value": "chunked" + }, + { + "key": "Date", + "value": "Fri, 15 May 2026 08:17:43 GMT" + }, + { + "key": "Keep-Alive", + "value": "timeout=60" + }, + { + "key": "Connection", + "value": "keep-alive" + } + ], + "cookie": [], + "body": "{\n \"id\": 2,\n \"fullname\": \"userUseruser\",\n \"username\": \"admin\",\n \"phone\": 987654321,\n \"email\": \"uuusernew@gmail.com\",\n \"password\": \"$2a$10$6WQnknR4sQj7BfE8o4nkpuyCOiqtUko/foxD.KptmCux2AcN53YDG\",\n \"numTicketsBought\": null,\n \"favoriteGenre\": \"None\",\n \"profileImage\": false,\n \"tickets\": [],\n \"roles\": [\n \"USER\",\n \"ADMIN\"\n ]\n}" + } + ] + }, + { + "name": "Create Ticket Request", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\r\n \"id\": 1,\r\n \"ticketType\": \"BASIC\",\r\n \"price\": 80.0,\r\n \"numTickets\": 1,\r\n \"eventId\": 2,\r\n \"userOwnerId\": 1\r\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "https://localhost:8443/api/v1/tickets/", + "protocol": "https", + "host": [ + "localhost" + ], + "port": "8443", + "path": [ + "api", + "v1", + "tickets", + "" + ] + } + }, + "response": [ + { + "name": "Create Ticket Request", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\r\n \"id\": 1,\r\n \"ticketType\": \"BASIC\",\r\n \"price\": 80.0,\r\n \"numTickets\": 1,\r\n \"eventId\": 2,\r\n \"userOwnerId\": 1\r\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "https://localhost:8443/api/v1/tickets/", + "protocol": "https", + "host": [ + "localhost" + ], + "port": "8443", + "path": [ + "api", + "v1", + "tickets", + "" + ] + } + }, + "status": "Created", + "code": 201, + "_postman_previewlanguage": null, + "header": [ + { + "key": "Location", + "value": "https://localhost:8443/api/v1/tickets/1" + }, + { + "key": "X-Content-Type-Options", + "value": "nosniff" + }, + { + "key": "X-XSS-Protection", + "value": "0" + }, + { + "key": "Cache-Control", + "value": "no-cache, no-store, max-age=0, must-revalidate" + }, + { + "key": "Pragma", + "value": "no-cache" + }, + { + "key": "Expires", + "value": "0" + }, + { + "key": "Strict-Transport-Security", + "value": "max-age=31536000 ; includeSubDomains" + }, + { + "key": "X-Frame-Options", + "value": "DENY" + }, + { + "key": "Content-Type", + "value": "application/json" + }, + { + "key": "Transfer-Encoding", + "value": "chunked" + }, + { + "key": "Date", + "value": "Fri, 15 May 2026 08:22:52 GMT" + }, + { + "key": "Keep-Alive", + "value": "timeout=60" + }, + { + "key": "Connection", + "value": "keep-alive" + } + ], + "cookie": [], + "body": "{\n \"id\": 1,\n \"ticketType\": \"BASIC\",\n \"price\": 80,\n \"numTickets\": 1,\n \"eventId\": 2,\n \"userOwnerId\": 2\n}" + } + ] + }, + { + "name": "Get AllTickets Request", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "https://localhost:8443/api/v1/tickets/", + "protocol": "https", + "host": [ + "localhost" + ], + "port": "8443", + "path": [ + "api", + "v1", + "tickets", + "" + ] + } + }, + "response": [ + { + "name": "Get AllTickets Request", + "originalRequest": { + "method": "GET", + "header": [], + "url": { + "raw": "https://localhost:8443/api/v1/tickets/", + "protocol": "https", + "host": [ + "localhost" + ], + "port": "8443", + "path": [ + "api", + "v1", + "tickets", + "" + ] + } + }, + "status": "OK", + "code": 200, + "_postman_previewlanguage": null, + "header": [ + { + "key": "X-Content-Type-Options", + "value": "nosniff" + }, + { + "key": "X-XSS-Protection", + "value": "0" + }, + { + "key": "Cache-Control", + "value": "no-cache, no-store, max-age=0, must-revalidate" + }, + { + "key": "Pragma", + "value": "no-cache" + }, + { + "key": "Expires", + "value": "0" + }, + { + "key": "Strict-Transport-Security", + "value": "max-age=31536000 ; includeSubDomains" + }, + { + "key": "X-Frame-Options", + "value": "DENY" + }, + { + "key": "Content-Type", + "value": "application/json" + }, + { + "key": "Transfer-Encoding", + "value": "chunked" + }, + { + "key": "Date", + "value": "Fri, 15 May 2026 08:23:37 GMT" + }, + { + "key": "Keep-Alive", + "value": "timeout=60" + }, + { + "key": "Connection", + "value": "keep-alive" + } + ], + "cookie": [], + "body": "{\n \"content\": [\n {\n \"id\": 1,\n \"ticketType\": \"BASIC\",\n \"price\": 80,\n \"numTickets\": 1,\n \"eventId\": 2,\n \"userOwnerId\": 2\n }\n ],\n \"page\": {\n \"size\": 20,\n \"number\": 0,\n \"totalElements\": 1,\n \"totalPages\": 1\n }\n}" + } + ] + }, + { + "name": "Get Ticket Request", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "https://localhost:8443/api/v1/tickets/1", + "protocol": "https", + "host": [ + "localhost" + ], + "port": "8443", + "path": [ + "api", + "v1", + "tickets", + "1" + ] + } + }, + "response": [ + { + "name": "Get Ticket Request", + "originalRequest": { + "method": "GET", + "header": [], + "url": { + "raw": "https://localhost:8443/api/v1/tickets/1", + "protocol": "https", + "host": [ + "localhost" + ], + "port": "8443", + "path": [ + "api", + "v1", + "tickets", + "1" + ] + } + }, + "status": "OK", + "code": 200, + "_postman_previewlanguage": null, + "header": [ + { + "key": "X-Content-Type-Options", + "value": "nosniff" + }, + { + "key": "X-XSS-Protection", + "value": "0" + }, + { + "key": "Cache-Control", + "value": "no-cache, no-store, max-age=0, must-revalidate" + }, + { + "key": "Pragma", + "value": "no-cache" + }, + { + "key": "Expires", + "value": "0" + }, + { + "key": "Strict-Transport-Security", + "value": "max-age=31536000 ; includeSubDomains" + }, + { + "key": "X-Frame-Options", + "value": "DENY" + }, + { + "key": "Content-Type", + "value": "application/json" + }, + { + "key": "Transfer-Encoding", + "value": "chunked" + }, + { + "key": "Date", + "value": "Fri, 15 May 2026 08:24:10 GMT" + }, + { + "key": "Keep-Alive", + "value": "timeout=60" + }, + { + "key": "Connection", + "value": "keep-alive" + } + ], + "cookie": [], + "body": "{\n \"id\": 1,\n \"ticketType\": \"BASIC\",\n \"price\": 80,\n \"numTickets\": 1,\n \"eventId\": 2,\n \"userOwnerId\": 2\n}" + } + ] + }, + { + "name": "Get Participant Request", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "https://localhost:8443/api/v1/participants/1", + "protocol": "https", + "host": [ + "localhost" + ], + "port": "8443", + "path": [ + "api", + "v1", + "participants", + "1" + ] + } + }, + "response": [ + { + "name": "Get Participant Request", + "originalRequest": { + "method": "GET", + "header": [], + "url": { + "raw": "https://localhost:8443/api/v1/participants/1", + "protocol": "https", + "host": [ + "localhost" + ], + "port": "8443", + "path": [ + "api", + "v1", + "participants", + "1" + ] + } + }, + "status": "OK", + "code": 200, + "_postman_previewlanguage": null, + "header": [ + { + "key": "X-Content-Type-Options", + "value": "nosniff" + }, + { + "key": "X-XSS-Protection", + "value": "0" + }, + { + "key": "Cache-Control", + "value": "no-cache, no-store, max-age=0, must-revalidate" + }, + { + "key": "Pragma", + "value": "no-cache" + }, + { + "key": "Expires", + "value": "0" + }, + { + "key": "Strict-Transport-Security", + "value": "max-age=31536000 ; includeSubDomains" + }, + { + "key": "X-Frame-Options", + "value": "DENY" + }, + { + "key": "Content-Type", + "value": "application/json" + }, + { + "key": "Transfer-Encoding", + "value": "chunked" + }, + { + "key": "Date", + "value": "Fri, 15 May 2026 08:25:14 GMT" + }, + { + "key": "Keep-Alive", + "value": "timeout=60" + }, + { + "key": "Connection", + "value": "keep-alive" + } + ], + "cookie": [], + "body": "{\n \"id\": 1,\n \"name\": \"Bad Bunny\",\n \"type\": \"Music Artist\",\n \"biography\": \"Puerto Rican global superstar known for redefining reggaeton and Latin trap, headlining major international festivals and sold-out world tours.\",\n \"participantImage\": true\n}" + } + ] + }, + { + "name": "Get AllParticipants Request", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "https://localhost:8443/api/v1/participants/", + "protocol": "https", + "host": [ + "localhost" + ], + "port": "8443", + "path": [ + "api", + "v1", + "participants", + "" + ] + } + }, + "response": [ + { + "name": "Get AllParticipants Request", + "originalRequest": { + "method": "GET", + "header": [], + "url": { + "raw": "https://localhost:8443/api/v1/participants/", + "protocol": "https", + "host": [ + "localhost" + ], + "port": "8443", + "path": [ + "api", + "v1", + "participants", + "" + ] + } + }, + "status": "OK", + "code": 200, + "_postman_previewlanguage": null, + "header": [ + { + "key": "X-Content-Type-Options", + "value": "nosniff" + }, + { + "key": "X-XSS-Protection", + "value": "0" + }, + { + "key": "Cache-Control", + "value": "no-cache, no-store, max-age=0, must-revalidate" + }, + { + "key": "Pragma", + "value": "no-cache" + }, + { + "key": "Expires", + "value": "0" + }, + { + "key": "Strict-Transport-Security", + "value": "max-age=31536000 ; includeSubDomains" + }, + { + "key": "X-Frame-Options", + "value": "DENY" + }, + { + "key": "Content-Type", + "value": "application/json" + }, + { + "key": "Transfer-Encoding", + "value": "chunked" + }, + { + "key": "Date", + "value": "Fri, 15 May 2026 08:25:45 GMT" + }, + { + "key": "Keep-Alive", + "value": "timeout=60" + }, + { + "key": "Connection", + "value": "keep-alive" + } + ], + "cookie": [], + "body": "{\n \"content\": [\n {\n \"id\": 1,\n \"name\": \"Bad Bunny\",\n \"type\": \"Music Artist\",\n \"biography\": \"Puerto Rican global superstar known for redefining reggaeton and Latin trap, headlining major international festivals and sold-out world tours.\",\n \"participantImage\": true\n },\n {\n \"id\": 2,\n \"name\": \"Olivia Rodrigo\",\n \"type\": \"Music Artist\",\n \"biography\": \"Grammy-winning artist recognized for emotional songwriting, powerful vocals and chart-topping pop-rock performances.\",\n \"participantImage\": true\n },\n {\n \"id\": 3,\n \"name\": \"Juan Dávila\",\n \"type\": \"Comedian\",\n \"biography\": \"Spanish stand-up comedian known for his interactive, provocative and improvisational comedy shows. Famous for breaking the fourth wall and engaging directly with the audience in live performances across Spain.\",\n \"participantImage\": true\n },\n {\n \"id\": 4,\n \"name\": \"Rosalía\",\n \"type\": \"Music Artist\",\n \"biography\": \"Internationally acclaimed Spanish singer blending flamenco, pop and experimental sounds, recognized for highly visual live shows.\",\n \"participantImage\": true\n },\n {\n \"id\": 5,\n \"name\": \"Jannik Sinner\",\n \"type\": \"Professional Tennis Player\",\n \"biography\": \"Italian tennis player, who has rapidly risen in the ATP rankings with his aggressive playing style and strong performances in major tournaments.\",\n \"participantImage\": true\n },\n {\n \"id\": 6,\n \"name\": \"Carlos Alcaraz\",\n \"type\": \"Professional Tennis Player\",\n \"biography\": \"Spanish Grand Slam champion known for his explosive playing style, athleticism and rapid rise in world tennis.\",\n \"participantImage\": true\n },\n {\n \"id\": 7,\n \"name\": \"Neil deGrasse Tyson\",\n \"type\": \"Scientist\",\n \"biography\": \"Astrophysicist and science communicator known for making complex scientific topics accessible to global audiences.\",\n \"participantImage\": true\n },\n {\n \"id\": 8,\n \"name\": \"Christopher Nolan\",\n \"type\": \"Film Director\",\n \"biography\": \"Acclaimed filmmaker known for ambitious storytelling, large-scale productions and influential contributions to modern cinema.\",\n \"participantImage\": true\n },\n {\n \"id\": 9,\n \"name\": \"Mark Ruffalo\",\n \"type\": \"Actor\",\n \"biography\": \"Renowned actor and environmental advocate, speaker at sustainability events and climate-awareness forums.\",\n \"participantImage\": true\n },\n {\n \"id\": 10,\n \"name\": \"Elon Musk\",\n \"type\": \"Tech Innovator\",\n \"biography\": \"Entrepreneur and technology leader associated with electric vehicles, space exploration, AI and future mobility.\",\n \"participantImage\": true\n },\n {\n \"id\": 11,\n \"name\": \"Jordi Roca\",\n \"type\": \"Chef\",\n \"biography\": \"Spanish-American chef and humanitarian known for innovative cuisine, culinary education and global food-relief initiatives.\",\n \"participantImage\": true\n },\n {\n \"id\": 12,\n \"name\": \"Pau Gasol\",\n \"type\": \"Basketball Player\",\n \"biography\": \"Former professional basketball player, NBA champion and ambassador for sports, health and youth development.\",\n \"participantImage\": true\n },\n {\n \"id\": 13,\n \"name\": \"Zendaya\",\n \"type\": \"Actress\",\n \"biography\": \"Award-winning actress and fashion icon, recognized for her roles in film and television and presence in international premieres.\",\n \"participantImage\": true\n },\n {\n \"id\": 14,\n \"name\": \"Tom Holland\",\n \"type\": \"Actor\",\n \"biography\": \"Popular actor known for blockbuster films and appearances in global entertainment conventions and fan events.\",\n \"participantImage\": true\n }\n ],\n \"page\": {\n \"size\": 20,\n \"number\": 0,\n \"totalElements\": 14,\n \"totalPages\": 1\n }\n}" + } + ] + }, + { + "name": "Get ParticipantImage Request", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "https://localhost:8443/api/v1/participants/1/image", + "protocol": "https", + "host": [ + "localhost" + ], + "port": "8443", + "path": [ + "api", + "v1", + "participants", + "1", + "image" + ] + } + }, + "response": [] + }, + { + "name": "Edit Participant Request", + "request": { + "method": "PUT", + "header": [], + "body": { + "mode": "raw", + "raw": "{\r\n \"id\": 1,\r\n \"name\": \"Edited Participant\",\r\n \"type\": \"Music Artist\",\r\n \"biography\": \"Puerto Rican global superstar known for redefining reggaeton and Latin trap, headlining major international festivals and sold-out world tours.\",\r\n \"participantImage\": true\r\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "https://localhost:8443/api/v1/participants/1", + "protocol": "https", + "host": [ + "localhost" + ], + "port": "8443", + "path": [ + "api", + "v1", + "participants", + "1" + ] + } + }, + "response": [ + { + "name": "Edit Participant Request", + "originalRequest": { + "method": "PUT", + "header": [], + "body": { + "mode": "raw", + "raw": "{\r\n \"id\": 1,\r\n \"name\": \"Edited Participant\",\r\n \"type\": \"Music Artist\",\r\n \"biography\": \"Puerto Rican global superstar known for redefining reggaeton and Latin trap, headlining major international festivals and sold-out world tours.\",\r\n \"participantImage\": true\r\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "https://localhost:8443/api/v1/participants/1", + "protocol": "https", + "host": [ + "localhost" + ], + "port": "8443", + "path": [ + "api", + "v1", + "participants", + "1" + ] + } + }, + "status": "OK", + "code": 200, + "_postman_previewlanguage": null, + "header": [ + { + "key": "X-Content-Type-Options", + "value": "nosniff" + }, + { + "key": "X-XSS-Protection", + "value": "0" + }, + { + "key": "Cache-Control", + "value": "no-cache, no-store, max-age=0, must-revalidate" + }, + { + "key": "Pragma", + "value": "no-cache" + }, + { + "key": "Expires", + "value": "0" + }, + { + "key": "Strict-Transport-Security", + "value": "max-age=31536000 ; includeSubDomains" + }, + { + "key": "X-Frame-Options", + "value": "DENY" + }, + { + "key": "Content-Type", + "value": "application/json" + }, + { + "key": "Transfer-Encoding", + "value": "chunked" + }, + { + "key": "Date", + "value": "Fri, 15 May 2026 08:27:48 GMT" + }, + { + "key": "Keep-Alive", + "value": "timeout=60" + }, + { + "key": "Connection", + "value": "keep-alive" + } + ], + "cookie": [], + "body": "{\n \"id\": 1,\n \"name\": \"Edited Participant\",\n \"type\": \"Music Artist\",\n \"biography\": \"Puerto Rican global superstar known for redefining reggaeton and Latin trap, headlining major international festivals and sold-out world tours.\",\n \"participantImage\": true\n}" + } + ] + }, + { + "name": "Delete Participant Request", + "request": { + "method": "DELETE", + "header": [], + "url": { + "raw": "https://localhost:8443/api/v1/participants/4", + "protocol": "https", + "host": [ + "localhost" + ], + "port": "8443", + "path": [ + "api", + "v1", + "participants", + "4" + ] + } + }, + "response": [ + { + "name": "Delete Participant Request", + "originalRequest": { + "method": "DELETE", + "header": [], + "url": { + "raw": "https://localhost:8443/api/v1/participants/4", + "protocol": "https", + "host": [ + "localhost" + ], + "port": "8443", + "path": [ + "api", + "v1", + "participants", + "4" + ] + } + }, + "status": "OK", + "code": 200, + "_postman_previewlanguage": null, + "header": [ + { + "key": "X-Content-Type-Options", + "value": "nosniff" + }, + { + "key": "X-XSS-Protection", + "value": "0" + }, + { + "key": "Cache-Control", + "value": "no-cache, no-store, max-age=0, must-revalidate" + }, + { + "key": "Pragma", + "value": "no-cache" + }, + { + "key": "Expires", + "value": "0" + }, + { + "key": "Strict-Transport-Security", + "value": "max-age=31536000 ; includeSubDomains" + }, + { + "key": "X-Frame-Options", + "value": "DENY" + }, + { + "key": "Content-Type", + "value": "application/json" + }, + { + "key": "Transfer-Encoding", + "value": "chunked" + }, + { + "key": "Date", + "value": "Fri, 15 May 2026 08:31:06 GMT" + }, + { + "key": "Keep-Alive", + "value": "timeout=60" + }, + { + "key": "Connection", + "value": "keep-alive" + } + ], + "cookie": [], + "body": "{\n \"id\": 4,\n \"name\": \"Rosalía\",\n \"type\": \"Music Artist\",\n \"biography\": \"Internationally acclaimed Spanish singer blending flamenco, pop and experimental sounds, recognized for highly visual live shows.\",\n \"participantImage\": true\n}" + } + ] + }, + { + "name": "Delete ParticipantImage Request", + "request": { + "method": "DELETE", + "header": [], + "url": { + "raw": "https://localhost:8443/api/v1/participants/1/image", + "protocol": "https", + "host": [ + "localhost" + ], + "port": "8443", + "path": [ + "api", + "v1", + "participants", + "1", + "image" + ] + } + }, + "response": [ + { + "name": "Delete ParticipantImage Request", + "originalRequest": { + "method": "DELETE", + "header": [], + "url": { + "raw": "https://localhost:8443/api/v1/participants/1/image", + "protocol": "https", + "host": [ + "localhost" + ], + "port": "8443", + "path": [ + "api", + "v1", + "participants", + "1", + "image" + ] + } + }, + "status": "No Content", + "code": 204, + "_postman_previewlanguage": null, + "header": [ + { + "key": "X-Content-Type-Options", + "value": "nosniff" + }, + { + "key": "X-XSS-Protection", + "value": "0" + }, + { + "key": "Cache-Control", + "value": "no-cache, no-store, max-age=0, must-revalidate" + }, + { + "key": "Pragma", + "value": "no-cache" + }, + { + "key": "Expires", + "value": "0" + }, + { + "key": "Strict-Transport-Security", + "value": "max-age=31536000 ; includeSubDomains" + }, + { + "key": "X-Frame-Options", + "value": "DENY" + }, + { + "key": "Date", + "value": "Fri, 15 May 2026 08:31:57 GMT" + }, + { + "key": "Keep-Alive", + "value": "timeout=60" + }, + { + "key": "Connection", + "value": "keep-alive" + } + ], + "cookie": [], + "body": null + } + ] + }, + { + "name": "Create ParticipantImage Request", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "formdata", + "formdata": [ + { + "key": "imageFile", + "type": "file", + "uuid": "496dd42d-a66e-4ead-b33f-dbf4cf48b030", + "src": "postman-cloud:///1f15035b-4202-43d0-bcd4-f21c70e0bf6c" + } + ] + }, + "url": { + "raw": "https://localhost:8443/api/v1/participants/1/image", + "protocol": "https", + "host": [ + "localhost" + ], + "port": "8443", + "path": [ + "api", + "v1", + "participants", + "1", + "image" + ] + } + }, + "response": [ + { + "name": "Create ParticipantImage Request", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "formdata", + "formdata": [ + { + "key": "imageFile", + "type": "file", + "uuid": "496dd42d-a66e-4ead-b33f-dbf4cf48b030", + "src": "postman-cloud:///1f15035b-4202-43d0-bcd4-f21c70e0bf6c" + } + ] + }, + "url": { + "raw": "https://localhost:8443/api/v1/participants/1/image", + "protocol": "https", + "host": [ + "localhost" + ], + "port": "8443", + "path": [ + "api", + "v1", + "participants", + "1", + "image" + ] + } + }, + "status": "Created", + "code": 201, + "_postman_previewlanguage": null, + "header": [ + { + "key": "Location", + "value": "https://localhost:8443/api/v1/participants/1/image" + }, + { + "key": "X-Content-Type-Options", + "value": "nosniff" + }, + { + "key": "X-XSS-Protection", + "value": "0" + }, + { + "key": "Cache-Control", + "value": "no-cache, no-store, max-age=0, must-revalidate" + }, + { + "key": "Pragma", + "value": "no-cache" + }, + { + "key": "Expires", + "value": "0" + }, + { + "key": "Strict-Transport-Security", + "value": "max-age=31536000 ; includeSubDomains" + }, + { + "key": "X-Frame-Options", + "value": "DENY" + }, + { + "key": "Content-Length", + "value": "0" + }, + { + "key": "Date", + "value": "Fri, 15 May 2026 08:32:47 GMT" + }, + { + "key": "Keep-Alive", + "value": "timeout=60" + }, + { + "key": "Connection", + "value": "keep-alive" + } + ], + "cookie": [], + "body": null + } + ] + }, + { + "name": "Edit ParticipantImage Request", + "request": { + "method": "PUT", + "header": [], + "body": { + "mode": "formdata", + "formdata": [ + { + "key": "imageFile", + "type": "file", + "uuid": "496dd42d-a66e-4ead-b33f-dbf4cf48b030", + "src": "postman-cloud:///1f15035b-4202-43d0-bcd4-f21c70e0bf6c" + } + ] + }, + "url": { + "raw": "https://localhost:8443/api/v1/participants/6/image", + "protocol": "https", + "host": [ + "localhost" + ], + "port": "8443", + "path": [ + "api", + "v1", + "participants", + "6", + "image" + ] + } + }, + "response": [ + { + "name": "Edit ParticipantImage Request", + "originalRequest": { + "method": "PUT", + "header": [], + "body": { + "mode": "formdata", + "formdata": [ + { + "key": "imageFile", + "type": "file", + "uuid": "496dd42d-a66e-4ead-b33f-dbf4cf48b030", + "src": "postman-cloud:///1f15035b-4202-43d0-bcd4-f21c70e0bf6c" + } + ] + }, + "url": { + "raw": "https://localhost:8443/api/v1/participants/6/image", + "protocol": "https", + "host": [ + "localhost" + ], + "port": "8443", + "path": [ + "api", + "v1", + "participants", + "6", + "image" + ] + } + }, + "status": "No Content", + "code": 204, + "_postman_previewlanguage": null, + "header": [ + { + "key": "X-Content-Type-Options", + "value": "nosniff" + }, + { + "key": "X-XSS-Protection", + "value": "0" + }, + { + "key": "Cache-Control", + "value": "no-cache, no-store, max-age=0, must-revalidate" + }, + { + "key": "Pragma", + "value": "no-cache" + }, + { + "key": "Expires", + "value": "0" + }, + { + "key": "Strict-Transport-Security", + "value": "max-age=31536000 ; includeSubDomains" + }, + { + "key": "X-Frame-Options", + "value": "DENY" + }, + { + "key": "Date", + "value": "Fri, 15 May 2026 08:33:25 GMT" + }, + { + "key": "Keep-Alive", + "value": "timeout=60" + }, + { + "key": "Connection", + "value": "keep-alive" + } + ], + "cookie": [], + "body": null + } + ] + }, + { + "name": "Create Participant Request", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\r\n \"id\": 1,\r\n \"name\": \"New Participant\",\r\n \"type\": \"Music Artist\",\r\n \"biography\": \"Puerto Rican global superstar known for redefining reggaeton and Latin trap, headlining major international festivals and sold-out world tours.\",\r\n \"participantImage\": false\r\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "https://localhost:8443/api/v1/participants/", + "protocol": "https", + "host": [ + "localhost" + ], + "port": "8443", + "path": [ + "api", + "v1", + "participants", + "" + ] + } + }, + "response": [ + { + "name": "Create Participant Request", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\r\n \"id\": 1,\r\n \"name\": \"New Participant\",\r\n \"type\": \"Music Artist\",\r\n \"biography\": \"Puerto Rican global superstar known for redefining reggaeton and Latin trap, headlining major international festivals and sold-out world tours.\",\r\n \"participantImage\": false\r\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "https://localhost:8443/api/v1/participants/", + "protocol": "https", + "host": [ + "localhost" + ], + "port": "8443", + "path": [ + "api", + "v1", + "participants", + "" + ] + } + }, + "status": "Created", + "code": 201, + "_postman_previewlanguage": null, + "header": [ + { + "key": "Location", + "value": "https://localhost:8443/api/v1/participants/15" + }, + { + "key": "X-Content-Type-Options", + "value": "nosniff" + }, + { + "key": "X-XSS-Protection", + "value": "0" + }, + { + "key": "Cache-Control", + "value": "no-cache, no-store, max-age=0, must-revalidate" + }, + { + "key": "Pragma", + "value": "no-cache" + }, + { + "key": "Expires", + "value": "0" + }, + { + "key": "Strict-Transport-Security", + "value": "max-age=31536000 ; includeSubDomains" + }, + { + "key": "X-Frame-Options", + "value": "DENY" + }, + { + "key": "Content-Type", + "value": "application/json" + }, + { + "key": "Transfer-Encoding", + "value": "chunked" + }, + { + "key": "Date", + "value": "Fri, 15 May 2026 08:34:24 GMT" + }, + { + "key": "Keep-Alive", + "value": "timeout=60" + }, + { + "key": "Connection", + "value": "keep-alive" + } + ], + "cookie": [], + "body": "{\n \"id\": 15,\n \"name\": \"New Participant\",\n \"type\": \"Music Artist\",\n \"biography\": \"Puerto Rican global superstar known for redefining reggaeton and Latin trap, headlining major international festivals and sold-out world tours.\",\n \"participantImage\": false\n}" + } + ] + }, + { + "name": "Get Event Request", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "https://localhost:8443/api/v1/events/1", + "protocol": "https", + "host": [ + "localhost" + ], + "port": "8443", + "path": [ + "api", + "v1", + "events", + "1" + ] + } + }, + "response": [ + { + "name": "Get Event Request", + "originalRequest": { + "method": "GET", + "header": [], + "url": { + "raw": "https://localhost:8443/api/v1/events/1", + "protocol": "https", + "host": [ + "localhost" + ], + "port": "8443", + "path": [ + "api", + "v1", + "events", + "1" + ] + } + }, + "status": "OK", + "code": 200, + "_postman_previewlanguage": null, + "header": [ + { + "key": "X-Content-Type-Options", + "value": "nosniff" + }, + { + "key": "X-XSS-Protection", + "value": "0" + }, + { + "key": "Cache-Control", + "value": "no-cache, no-store, max-age=0, must-revalidate" + }, + { + "key": "Pragma", + "value": "no-cache" + }, + { + "key": "Expires", + "value": "0" + }, + { + "key": "Strict-Transport-Security", + "value": "max-age=31536000 ; includeSubDomains" + }, + { + "key": "X-Frame-Options", + "value": "DENY" + }, + { + "key": "Content-Type", + "value": "application/json" + }, + { + "key": "Transfer-Encoding", + "value": "chunked" + }, + { + "key": "Date", + "value": "Fri, 15 May 2026 08:36:31 GMT" + }, + { + "key": "Keep-Alive", + "value": "timeout=60" + }, + { + "key": "Connection", + "value": "keep-alive" + } + ], + "cookie": [], + "body": "{\n \"id\": 1,\n \"title\": \"Global Latin Music Festival\",\n \"description\": \"A large-scale live music festival bringing together leading Latin and international artists. The event includes full-stage performances, VIP fan zones, immersive lighting, food areas and a night focused on reggaeton, pop and flamenco fusion.\",\n \"category\": \"Music\",\n \"location\": \"Madrid, WiZink Center\",\n \"date\": \"2026-05-10\",\n \"time\": \"21:00\",\n \"basicPrice\": 80,\n \"vipPrice\": 250,\n \"availableBasicTickets\": 15000,\n \"availableVipTickets\": 1000,\n \"image\": true,\n \"participants\": [\n {\n \"id\": 1,\n \"name\": \"Edited Participant\",\n \"type\": \"Music Artist\",\n \"biography\": \"Puerto Rican global superstar known for redefining reggaeton and Latin trap, headlining major international festivals and sold-out world tours.\",\n \"participantImage\": true\n },\n {\n \"id\": 2,\n \"name\": \"Olivia Rodrigo\",\n \"type\": \"Music Artist\",\n \"biography\": \"Grammy-winning artist recognized for emotional songwriting, powerful vocals and chart-topping pop-rock performances.\",\n \"participantImage\": true\n }\n ],\n \"tickets\": []\n}" + } + ] + }, + { + "name": "Get AllEvents Request", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "https://localhost:8443/api/v1/events/", + "protocol": "https", + "host": [ + "localhost" + ], + "port": "8443", + "path": [ + "api", + "v1", + "events", + "" + ] + } + }, + "response": [ + { + "name": "Get AllEvents Request", + "originalRequest": { + "method": "GET", + "header": [], + "url": { + "raw": "https://localhost:8443/api/v1/events/", + "protocol": "https", + "host": [ + "localhost" + ], + "port": "8443", + "path": [ + "api", + "v1", + "events", + "" + ] + } + }, + "status": "OK", + "code": 200, + "_postman_previewlanguage": null, + "header": [ + { + "key": "X-Content-Type-Options", + "value": "nosniff" + }, + { + "key": "X-XSS-Protection", + "value": "0" + }, + { + "key": "Cache-Control", + "value": "no-cache, no-store, max-age=0, must-revalidate" + }, + { + "key": "Pragma", + "value": "no-cache" + }, + { + "key": "Expires", + "value": "0" + }, + { + "key": "Strict-Transport-Security", + "value": "max-age=31536000 ; includeSubDomains" + }, + { + "key": "X-Frame-Options", + "value": "DENY" + }, + { + "key": "Content-Type", + "value": "application/json" + }, + { + "key": "Transfer-Encoding", + "value": "chunked" + }, + { + "key": "Date", + "value": "Fri, 15 May 2026 08:37:02 GMT" + }, + { + "key": "Keep-Alive", + "value": "timeout=60" + }, + { + "key": "Connection", + "value": "keep-alive" + } + ], + "cookie": [], + "body": "{\n \"content\": [\n {\n \"id\": 1,\n \"title\": \"Global Latin Music Festival\",\n \"description\": \"A large-scale live music festival bringing together leading Latin and international artists. The event includes full-stage performances, VIP fan zones, immersive lighting, food areas and a night focused on reggaeton, pop and flamenco fusion.\",\n \"category\": \"Music\",\n \"location\": \"Madrid, WiZink Center\",\n \"date\": \"2026-05-10\",\n \"time\": \"21:00\",\n \"basicPrice\": 80,\n \"vipPrice\": 250,\n \"availableBasicTickets\": 15000,\n \"availableVipTickets\": 1000,\n \"image\": true,\n \"participants\": [\n {\n \"id\": 1,\n \"name\": \"Edited Participant\",\n \"type\": \"Music Artist\",\n \"biography\": \"Puerto Rican global superstar known for redefining reggaeton and Latin trap, headlining major international festivals and sold-out world tours.\",\n \"participantImage\": true\n },\n {\n \"id\": 2,\n \"name\": \"Olivia Rodrigo\",\n \"type\": \"Music Artist\",\n \"biography\": \"Grammy-winning artist recognized for emotional songwriting, powerful vocals and chart-topping pop-rock performances.\",\n \"participantImage\": true\n }\n ],\n \"tickets\": []\n },\n {\n \"id\": 2,\n \"title\": \"Olivia Rodrigo Concert Experience\",\n \"description\": \"A concert experience focused on emotional songwriting, acoustic arrangements and powerful live vocals. The event is designed for fans who want a closer connection with the artist and the stories behind the songs.\",\n \"category\": \"Music\",\n \"location\": \"Barcelona, Palau Sant Jordi\",\n \"date\": \"2026-06-14\",\n \"time\": \"20:30\",\n \"basicPrice\": 55,\n \"vipPrice\": 160,\n \"availableBasicTickets\": 8999,\n \"availableVipTickets\": 600,\n \"image\": true,\n \"participants\": [\n {\n \"id\": 2,\n \"name\": \"Olivia Rodrigo\",\n \"type\": \"Music Artist\",\n \"biography\": \"Grammy-winning artist recognized for emotional songwriting, powerful vocals and chart-topping pop-rock performances.\",\n \"participantImage\": true\n }\n ],\n \"tickets\": [\n {\n \"id\": 1,\n \"ticketType\": \"BASIC\",\n \"price\": 80,\n \"numTickets\": 1,\n \"eventId\": 2,\n \"userOwnerId\": 2\n }\n ]\n },\n {\n \"id\": 3,\n \"title\": \"Stand-Up Comedy Night: Juan Dávila Live\",\n \"description\": \"A live comedy show full of improvisation, audience interaction and unpredictable moments. Juan Dávila brings his characteristic bold humor to a theatre night where the crowd becomes part of the performance.\",\n \"category\": \"Comedy\",\n \"location\": \"Fuenlabrada, Madrid\",\n \"date\": \"2026-03-15\",\n \"time\": \"21:00\",\n \"basicPrice\": 25,\n \"vipPrice\": 60,\n \"availableBasicTickets\": 500,\n \"availableVipTickets\": 80,\n \"image\": true,\n \"participants\": [\n {\n \"id\": 3,\n \"name\": \"Juan Dávila\",\n \"type\": \"Comedian\",\n \"biography\": \"Spanish stand-up comedian known for his interactive, provocative and improvisational comedy shows. Famous for breaking the fourth wall and engaging directly with the audience in live performances across Spain.\",\n \"participantImage\": true\n }\n ],\n \"tickets\": []\n },\n {\n \"id\": 4,\n \"title\": \"Roland Garros Champions Exhibition\",\n \"description\": \"A premium tennis exhibition featuring elite-level rallies, training demonstrations and a special match format inspired by Grand Slam competition. Fans will enjoy a close look at modern tennis intensity and technique.\",\n \"category\": \"Sports\",\n \"location\": \"Paris, Court Philippe-Chatrier\",\n \"date\": \"2026-06-07\",\n \"time\": \"15:00\",\n \"basicPrice\": 180,\n \"vipPrice\": 600,\n \"availableBasicTickets\": 14000,\n \"availableVipTickets\": 1200,\n \"image\": true,\n \"participants\": [\n {\n \"id\": 5,\n \"name\": \"Jannik Sinner\",\n \"type\": \"Professional Tennis Player\",\n \"biography\": \"Italian tennis player, who has rapidly risen in the ATP rankings with his aggressive playing style and strong performances in major tournaments.\",\n \"participantImage\": true\n },\n {\n \"id\": 6,\n \"name\": \"Carlos Alcaraz\",\n \"type\": \"Professional Tennis Player\",\n \"biography\": \"Spanish Grand Slam champion known for his explosive playing style, athleticism and rapid rise in world tennis.\",\n \"participantImage\": true\n }\n ],\n \"tickets\": []\n },\n {\n \"id\": 5,\n \"title\": \"Future of Space and Artificial Intelligence\",\n \"description\": \"A technology conference exploring the future of space exploration, artificial intelligence, electric mobility and scientific communication. The event includes keynote talks, public Q&A and discussions about innovation and society.\",\n \"category\": \"Technology\",\n \"location\": \"San Francisco, USA\",\n \"date\": \"2026-04-20\",\n \"time\": \"11:00\",\n \"basicPrice\": 150,\n \"vipPrice\": 350,\n \"availableBasicTickets\": 1200,\n \"availableVipTickets\": 150,\n \"image\": true,\n \"participants\": [\n {\n \"id\": 7,\n \"name\": \"Neil deGrasse Tyson\",\n \"type\": \"Scientist\",\n \"biography\": \"Astrophysicist and science communicator known for making complex scientific topics accessible to global audiences.\",\n \"participantImage\": true\n },\n {\n \"id\": 10,\n \"name\": \"Elon Musk\",\n \"type\": \"Tech Innovator\",\n \"biography\": \"Entrepreneur and technology leader associated with electric vehicles, space exploration, AI and future mobility.\",\n \"participantImage\": true\n }\n ],\n \"tickets\": []\n },\n {\n \"id\": 6,\n \"title\": \"Cinema Masters: Storytelling and Performance\",\n \"description\": \"A cinema forum focused on directing, acting and the creative process behind major film productions. The session includes a director talk, actor discussion and audience questions about modern filmmaking.\",\n \"category\": \"Cinema\",\n \"location\": \"London, BFI Southbank\",\n \"date\": \"2026-09-18\",\n \"time\": \"18:30\",\n \"basicPrice\": 70,\n \"vipPrice\": 220,\n \"availableBasicTickets\": 900,\n \"availableVipTickets\": 120,\n \"image\": true,\n \"participants\": [\n {\n \"id\": 8,\n \"name\": \"Christopher Nolan\",\n \"type\": \"Film Director\",\n \"biography\": \"Acclaimed filmmaker known for ambitious storytelling, large-scale productions and influential contributions to modern cinema.\",\n \"participantImage\": true\n },\n {\n \"id\": 9,\n \"name\": \"Mark Ruffalo\",\n \"type\": \"Actor\",\n \"biography\": \"Renowned actor and environmental advocate, speaker at sustainability events and climate-awareness forums.\",\n \"participantImage\": true\n }\n ],\n \"tickets\": []\n },\n {\n \"id\": 7,\n \"title\": \"Elite Sports Legends Tournament\",\n \"description\": \"A high-profile international sports event bringing together elite athletes from tennis and basketball. The event includes exhibition matches, skills challenges, fan interactions and training sessions led by world-class professionals. Attendees will experience top-level competition, behind-the-scenes insights and motivational talks on discipline, performance and success in professional sports.\",\n \"category\": \"Sports\",\n \"location\": \"Miami, USA\",\n \"date\": \"2026-07-20\",\n \"time\": \"18:00\",\n \"basicPrice\": 120,\n \"vipPrice\": 400,\n \"availableBasicTickets\": 20000,\n \"availableVipTickets\": 1500,\n \"image\": true,\n \"participants\": [\n {\n \"id\": 5,\n \"name\": \"Jannik Sinner\",\n \"type\": \"Professional Tennis Player\",\n \"biography\": \"Italian tennis player, who has rapidly risen in the ATP rankings with his aggressive playing style and strong performances in major tournaments.\",\n \"participantImage\": true\n },\n {\n \"id\": 6,\n \"name\": \"Carlos Alcaraz\",\n \"type\": \"Professional Tennis Player\",\n \"biography\": \"Spanish Grand Slam champion known for his explosive playing style, athleticism and rapid rise in world tennis.\",\n \"participantImage\": true\n },\n {\n \"id\": 12,\n \"name\": \"Pau Gasol\",\n \"type\": \"Basketball Player\",\n \"biography\": \"Former professional basketball player, NBA champion and ambassador for sports, health and youth development.\",\n \"participantImage\": true\n }\n ],\n \"tickets\": []\n },\n {\n \"id\": 8,\n \"title\": \"Top Dessert Masterclass\",\n \"description\": \"A culinary masterclass focused on creative desserts, pastry techniques, sensory presentation and innovation in modern gastronomy. Attendees will learn about textures, plating and the creative process of high-level cuisine.\",\n \"category\": \"Gastronomy\",\n \"location\": \"Girona, Spain\",\n \"date\": \"2026-06-18\",\n \"time\": \"12:00\",\n \"basicPrice\": 200,\n \"vipPrice\": 450,\n \"availableBasicTickets\": 80,\n \"availableVipTickets\": 15,\n \"image\": true,\n \"participants\": [\n {\n \"id\": 11,\n \"name\": \"Jordi Roca\",\n \"type\": \"Chef\",\n \"biography\": \"Spanish-American chef and humanitarian known for innovative cuisine, culinary education and global food-relief initiatives.\",\n \"participantImage\": true\n }\n ],\n \"tickets\": []\n },\n {\n \"id\": 9,\n \"title\": \"Basketball Leadership Camp\",\n \"description\": \"A sports and leadership event combining basketball training, personal development and talks about discipline, teamwork and health. Designed for young athletes and fans interested in professional sports culture.\",\n \"category\": \"Sports\",\n \"location\": \"Barcelona, Spain\",\n \"date\": \"2026-08-02\",\n \"time\": \"09:30\",\n \"basicPrice\": 35,\n \"vipPrice\": 90,\n \"availableBasicTickets\": 600,\n \"availableVipTickets\": 70,\n \"image\": true,\n \"participants\": [\n {\n \"id\": 12,\n \"name\": \"Pau Gasol\",\n \"type\": \"Basketball Player\",\n \"biography\": \"Former professional basketball player, NBA champion and ambassador for sports, health and youth development.\",\n \"participantImage\": true\n }\n ],\n \"tickets\": []\n },\n {\n \"id\": 10,\n \"title\": \"Young Hollywood Fan Convention\",\n \"description\": \"Entertainment convention featuring panels, meet-and-greet sessions, fan activities and conversations about blockbuster cinema, acting careers and international productions.\",\n \"category\": \"Cinema\",\n \"location\": \"Los Angeles, USA\",\n \"date\": \"2026-11-05\",\n \"time\": \"19:00\",\n \"basicPrice\": 90,\n \"vipPrice\": 280,\n \"availableBasicTickets\": 3000,\n \"availableVipTickets\": 350,\n \"image\": true,\n \"participants\": [\n {\n \"id\": 13,\n \"name\": \"Zendaya\",\n \"type\": \"Actress\",\n \"biography\": \"Award-winning actress and fashion icon, recognized for her roles in film and television and presence in international premieres.\",\n \"participantImage\": true\n },\n {\n \"id\": 14,\n \"name\": \"Tom Holland\",\n \"type\": \"Actor\",\n \"biography\": \"Popular actor known for blockbuster films and appearances in global entertainment conventions and fan events.\",\n \"participantImage\": true\n }\n ],\n \"tickets\": []\n },\n {\n \"id\": 11,\n \"title\": \"Music, Culture and Social Impact Summit\",\n \"description\": \"A multidisciplinary event connecting music, cinema and social impact. Artists and public figures discuss creativity, fame, activism, identity and the influence of entertainment on younger generations.\",\n \"category\": \"Culture\",\n \"location\": \"New York, USA\",\n \"date\": \"2026-12-13\",\n \"time\": \"20:30\",\n \"basicPrice\": 120,\n \"vipPrice\": 400,\n \"availableBasicTickets\": 5000,\n \"availableVipTickets\": 500,\n \"image\": true,\n \"participants\": [\n {\n \"id\": 2,\n \"name\": \"Olivia Rodrigo\",\n \"type\": \"Music Artist\",\n \"biography\": \"Grammy-winning artist recognized for emotional songwriting, powerful vocals and chart-topping pop-rock performances.\",\n \"participantImage\": true\n },\n {\n \"id\": 9,\n \"name\": \"Mark Ruffalo\",\n \"type\": \"Actor\",\n \"biography\": \"Renowned actor and environmental advocate, speaker at sustainability events and climate-awareness forums.\",\n \"participantImage\": true\n }\n ],\n \"tickets\": []\n }\n ],\n \"page\": {\n \"size\": 20,\n \"number\": 0,\n \"totalElements\": 11,\n \"totalPages\": 1\n }\n}" + } + ] + }, + { + "name": "Get EventImage Request", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "https://localhost:8443/api/v1/events/1/image", + "protocol": "https", + "host": [ + "localhost" + ], + "port": "8443", + "path": [ + "api", + "v1", + "events", + "1", + "image" + ] + } + }, + "response": [] + }, + { + "name": "Create Event Request", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\r\n \"id\": 1,\r\n \"title\": \"New Event\",\r\n \"description\": \"New Event\",\r\n \"category\": \"New Event\",\r\n \"location\": \"Madrid, WiZink Center\",\r\n \"date\": \"2026-05-10\",\r\n \"time\": \"21:00\",\r\n \"basicPrice\": 80,\r\n \"vipPrice\": 250,\r\n \"availableBasicTickets\": 15000,\r\n \"availableVipTickets\": 1000,\r\n \"image\": false,\r\n \"participants\": [\r\n {\r\n \"id\": 1,\r\n \"name\": \"Edited Participant\",\r\n \"type\": \"Music Artist\",\r\n \"biography\": \"Puerto Rican global superstar known for redefining reggaeton and Latin trap, headlining major international festivals and sold-out world tours.\",\r\n \"participantImage\": true\r\n },\r\n {\r\n \"id\": 2,\r\n \"name\": \"Olivia Rodrigo\",\r\n \"type\": \"Music Artist\",\r\n \"biography\": \"Grammy-winning artist recognized for emotional songwriting, powerful vocals and chart-topping pop-rock performances.\",\r\n \"participantImage\": true\r\n }\r\n ],\r\n \"tickets\": []\r\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "https://localhost:8443/api/v1/events/", + "protocol": "https", + "host": [ + "localhost" + ], + "port": "8443", + "path": [ + "api", + "v1", + "events", + "" + ] + } + }, + "response": [ + { + "name": "Create Event Request", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\r\n \"id\": 1,\r\n \"title\": \"New Event\",\r\n \"description\": \"New Event\",\r\n \"category\": \"New Event\",\r\n \"location\": \"Madrid, WiZink Center\",\r\n \"date\": \"2026-05-10\",\r\n \"time\": \"21:00\",\r\n \"basicPrice\": 80,\r\n \"vipPrice\": 250,\r\n \"availableBasicTickets\": 15000,\r\n \"availableVipTickets\": 1000,\r\n \"image\": false,\r\n \"participants\": [\r\n {\r\n \"id\": 1,\r\n \"name\": \"Edited Participant\",\r\n \"type\": \"Music Artist\",\r\n \"biography\": \"Puerto Rican global superstar known for redefining reggaeton and Latin trap, headlining major international festivals and sold-out world tours.\",\r\n \"participantImage\": true\r\n },\r\n {\r\n \"id\": 2,\r\n \"name\": \"Olivia Rodrigo\",\r\n \"type\": \"Music Artist\",\r\n \"biography\": \"Grammy-winning artist recognized for emotional songwriting, powerful vocals and chart-topping pop-rock performances.\",\r\n \"participantImage\": true\r\n }\r\n ],\r\n \"tickets\": []\r\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "https://localhost:8443/api/v1/events/", + "protocol": "https", + "host": [ + "localhost" + ], + "port": "8443", + "path": [ + "api", + "v1", + "events", + "" + ] + } + }, + "status": "Created", + "code": 201, + "_postman_previewlanguage": null, + "header": [ + { + "key": "Location", + "value": "https://localhost:8443/api/v1/events/12" + }, + { + "key": "X-Content-Type-Options", + "value": "nosniff" + }, + { + "key": "X-XSS-Protection", + "value": "0" + }, + { + "key": "Cache-Control", + "value": "no-cache, no-store, max-age=0, must-revalidate" + }, + { + "key": "Pragma", + "value": "no-cache" + }, + { + "key": "Expires", + "value": "0" + }, + { + "key": "Strict-Transport-Security", + "value": "max-age=31536000 ; includeSubDomains" + }, + { + "key": "X-Frame-Options", + "value": "DENY" + }, + { + "key": "Content-Type", + "value": "application/json" + }, + { + "key": "Transfer-Encoding", + "value": "chunked" + }, + { + "key": "Date", + "value": "Fri, 15 May 2026 08:38:31 GMT" + }, + { + "key": "Keep-Alive", + "value": "timeout=60" + }, + { + "key": "Connection", + "value": "keep-alive" + } + ], + "cookie": [], + "body": "{\n \"id\": 12,\n \"title\": \"New Event\",\n \"description\": \"New Event\",\n \"category\": \"New Event\",\n \"location\": \"Madrid, WiZink Center\",\n \"date\": \"2026-05-10\",\n \"time\": \"21:00\",\n \"basicPrice\": 80,\n \"vipPrice\": 250,\n \"availableBasicTickets\": 15000,\n \"availableVipTickets\": 1000,\n \"image\": false,\n \"participants\": [\n {\n \"id\": 1,\n \"name\": \"Edited Participant\",\n \"type\": \"Music Artist\",\n \"biography\": \"Puerto Rican global superstar known for redefining reggaeton and Latin trap, headlining major international festivals and sold-out world tours.\",\n \"participantImage\": true\n },\n {\n \"id\": 2,\n \"name\": \"Olivia Rodrigo\",\n \"type\": \"Music Artist\",\n \"biography\": \"Grammy-winning artist recognized for emotional songwriting, powerful vocals and chart-topping pop-rock performances.\",\n \"participantImage\": true\n }\n ],\n \"tickets\": null\n}" + } + ] + }, + { + "name": "Edit Event Request", + "request": { + "method": "PUT", + "header": [], + "body": { + "mode": "raw", + "raw": "{\r\n \"id\": 1,\r\n \"title\": \"Edited event\",\r\n \"description\": \"A large-scale live music festival bringing together leading Latin and international artists. The event includes full-stage performances, VIP fan zones, immersive lighting, food areas and a night focused on reggaeton, pop and flamenco fusion.\",\r\n \"category\": \"Music\",\r\n \"location\": \"Madrid, WiZink Center\",\r\n \"date\": \"2026-05-10\",\r\n \"time\": \"21:00\",\r\n \"basicPrice\": 80,\r\n \"vipPrice\": 250,\r\n \"availableBasicTickets\": 15000,\r\n \"availableVipTickets\": 1000,\r\n \"image\": true,\r\n \"participants\": [\r\n {\r\n \"id\": 1,\r\n \"name\": \"Edited Participant\",\r\n \"type\": \"Music Artist\",\r\n \"biography\": \"Puerto Rican global superstar known for redefining reggaeton and Latin trap, headlining major international festivals and sold-out world tours.\",\r\n \"participantImage\": true\r\n },\r\n {\r\n \"id\": 2,\r\n \"name\": \"Olivia Rodrigo\",\r\n \"type\": \"Music Artist\",\r\n \"biography\": \"Grammy-winning artist recognized for emotional songwriting, powerful vocals and chart-topping pop-rock performances.\",\r\n \"participantImage\": true\r\n }\r\n ],\r\n \"tickets\": []\r\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "https://localhost:8443/api/v1/events/1", + "protocol": "https", + "host": [ + "localhost" + ], + "port": "8443", + "path": [ + "api", + "v1", + "events", + "1" + ] + } + }, + "response": [ + { + "name": "Edit Event Request", + "originalRequest": { + "method": "PUT", + "header": [], + "body": { + "mode": "raw", + "raw": "{\r\n \"id\": 1,\r\n \"title\": \"Edited event\",\r\n \"description\": \"A large-scale live music festival bringing together leading Latin and international artists. The event includes full-stage performances, VIP fan zones, immersive lighting, food areas and a night focused on reggaeton, pop and flamenco fusion.\",\r\n \"category\": \"Music\",\r\n \"location\": \"Madrid, WiZink Center\",\r\n \"date\": \"2026-05-10\",\r\n \"time\": \"21:00\",\r\n \"basicPrice\": 80,\r\n \"vipPrice\": 250,\r\n \"availableBasicTickets\": 15000,\r\n \"availableVipTickets\": 1000,\r\n \"image\": true,\r\n \"participants\": [\r\n {\r\n \"id\": 1,\r\n \"name\": \"Edited Participant\",\r\n \"type\": \"Music Artist\",\r\n \"biography\": \"Puerto Rican global superstar known for redefining reggaeton and Latin trap, headlining major international festivals and sold-out world tours.\",\r\n \"participantImage\": true\r\n },\r\n {\r\n \"id\": 2,\r\n \"name\": \"Olivia Rodrigo\",\r\n \"type\": \"Music Artist\",\r\n \"biography\": \"Grammy-winning artist recognized for emotional songwriting, powerful vocals and chart-topping pop-rock performances.\",\r\n \"participantImage\": true\r\n }\r\n ],\r\n \"tickets\": []\r\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "https://localhost:8443/api/v1/events/1", + "protocol": "https", + "host": [ + "localhost" + ], + "port": "8443", + "path": [ + "api", + "v1", + "events", + "1" + ] + } + }, + "status": "OK", + "code": 200, + "_postman_previewlanguage": null, + "header": [ + { + "key": "X-Content-Type-Options", + "value": "nosniff" + }, + { + "key": "X-XSS-Protection", + "value": "0" + }, + { + "key": "Cache-Control", + "value": "no-cache, no-store, max-age=0, must-revalidate" + }, + { + "key": "Pragma", + "value": "no-cache" + }, + { + "key": "Expires", + "value": "0" + }, + { + "key": "Strict-Transport-Security", + "value": "max-age=31536000 ; includeSubDomains" + }, + { + "key": "X-Frame-Options", + "value": "DENY" + }, + { + "key": "Content-Type", + "value": "application/json" + }, + { + "key": "Transfer-Encoding", + "value": "chunked" + }, + { + "key": "Date", + "value": "Fri, 15 May 2026 08:48:29 GMT" + }, + { + "key": "Keep-Alive", + "value": "timeout=60" + }, + { + "key": "Connection", + "value": "keep-alive" + } + ], + "cookie": [], + "body": "{\n \"id\": 1,\n \"title\": \"Edited event\",\n \"description\": \"A large-scale live music festival bringing together leading Latin and international artists. The event includes full-stage performances, VIP fan zones, immersive lighting, food areas and a night focused on reggaeton, pop and flamenco fusion.\",\n \"category\": \"Music\",\n \"location\": \"Madrid, WiZink Center\",\n \"date\": \"2026-05-10\",\n \"time\": \"21:00\",\n \"basicPrice\": 80,\n \"vipPrice\": 250,\n \"availableBasicTickets\": 15000,\n \"availableVipTickets\": 1000,\n \"image\": true,\n \"participants\": [\n {\n \"id\": 1,\n \"name\": \"Bad Bunny\",\n \"type\": \"Music Artist\",\n \"biography\": \"Puerto Rican global superstar known for redefining reggaeton and Latin trap, headlining major international festivals and sold-out world tours.\",\n \"participantImage\": true\n },\n {\n \"id\": 2,\n \"name\": \"Olivia Rodrigo\",\n \"type\": \"Music Artist\",\n \"biography\": \"Grammy-winning artist recognized for emotional songwriting, powerful vocals and chart-topping pop-rock performances.\",\n \"participantImage\": true\n }\n ],\n \"tickets\": []\n}" + } + ] + }, + { + "name": "Delete Event Request", + "request": { + "method": "DELETE", + "header": [], + "url": { + "raw": "https://localhost:8443/api/v1/events/5", + "protocol": "https", + "host": [ + "localhost" + ], + "port": "8443", + "path": [ + "api", + "v1", + "events", + "5" + ] + } + }, + "response": [ + { + "name": "Delete Event Request", + "originalRequest": { + "method": "DELETE", + "header": [], + "url": { + "raw": "https://localhost:8443/api/v1/events/5", + "protocol": "https", + "host": [ + "localhost" + ], + "port": "8443", + "path": [ + "api", + "v1", + "events", + "5" + ] + } + }, + "status": "OK", + "code": 200, + "_postman_previewlanguage": null, + "header": [ + { + "key": "X-Content-Type-Options", + "value": "nosniff" + }, + { + "key": "X-XSS-Protection", + "value": "0" + }, + { + "key": "Cache-Control", + "value": "no-cache, no-store, max-age=0, must-revalidate" + }, + { + "key": "Pragma", + "value": "no-cache" + }, + { + "key": "Expires", + "value": "0" + }, + { + "key": "Strict-Transport-Security", + "value": "max-age=31536000 ; includeSubDomains" + }, + { + "key": "X-Frame-Options", + "value": "DENY" + }, + { + "key": "Content-Type", + "value": "application/json" + }, + { + "key": "Transfer-Encoding", + "value": "chunked" + }, + { + "key": "Date", + "value": "Fri, 15 May 2026 08:40:51 GMT" + }, + { + "key": "Keep-Alive", + "value": "timeout=60" + }, + { + "key": "Connection", + "value": "keep-alive" + } + ], + "cookie": [], + "body": "{\n \"id\": 5,\n \"title\": \"Future of Space and Artificial Intelligence\",\n \"description\": \"A technology conference exploring the future of space exploration, artificial intelligence, electric mobility and scientific communication. The event includes keynote talks, public Q&A and discussions about innovation and society.\",\n \"category\": \"Technology\",\n \"location\": \"San Francisco, USA\",\n \"date\": \"2026-04-20\",\n \"time\": \"11:00\",\n \"basicPrice\": 150,\n \"vipPrice\": 350,\n \"availableBasicTickets\": 1200,\n \"availableVipTickets\": 150,\n \"image\": true,\n \"participants\": [\n {\n \"id\": 7,\n \"name\": \"Neil deGrasse Tyson\",\n \"type\": \"Scientist\",\n \"biography\": \"Astrophysicist and science communicator known for making complex scientific topics accessible to global audiences.\",\n \"participantImage\": true\n },\n {\n \"id\": 10,\n \"name\": \"Elon Musk\",\n \"type\": \"Tech Innovator\",\n \"biography\": \"Entrepreneur and technology leader associated with electric vehicles, space exploration, AI and future mobility.\",\n \"participantImage\": true\n }\n ],\n \"tickets\": []\n}" + } + ] + }, + { + "name": "Create EventImage Request", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "formdata", + "formdata": [ + { + "key": "imageFile", + "type": "file", + "uuid": "75d8037e-c892-40d3-85db-91919b5a3b4c", + "src": "postman-cloud:///1f15035b-4202-43d0-bcd4-f21c70e0bf6c" + } + ] + }, + "url": { + "raw": "https://localhost:8443/api/v1/events/6/image", + "protocol": "https", + "host": [ + "localhost" + ], + "port": "8443", + "path": [ + "api", + "v1", + "events", + "6", + "image" + ] + } + }, + "response": [ + { + "name": "Create EventImage Request", + "originalRequest": { + "method": "POST", + "header": [], + "body": { + "mode": "formdata", + "formdata": [ + { + "key": "imageFile", + "type": "file", + "uuid": "75d8037e-c892-40d3-85db-91919b5a3b4c", + "src": "postman-cloud:///1f15035b-4202-43d0-bcd4-f21c70e0bf6c" + } + ] + }, + "url": { + "raw": "https://localhost:8443/api/v1/events/6/image", + "protocol": "https", + "host": [ + "localhost" + ], + "port": "8443", + "path": [ + "api", + "v1", + "events", + "6", + "image" + ] + } + }, + "status": "Created", + "code": 201, + "_postman_previewlanguage": null, + "header": [ + { + "key": "Location", + "value": "https://localhost:8443/api/v1/events/6/image" + }, + { + "key": "X-Content-Type-Options", + "value": "nosniff" + }, + { + "key": "X-XSS-Protection", + "value": "0" + }, + { + "key": "Cache-Control", + "value": "no-cache, no-store, max-age=0, must-revalidate" + }, + { + "key": "Pragma", + "value": "no-cache" + }, + { + "key": "Expires", + "value": "0" + }, + { + "key": "Strict-Transport-Security", + "value": "max-age=31536000 ; includeSubDomains" + }, + { + "key": "X-Frame-Options", + "value": "DENY" + }, + { + "key": "Content-Length", + "value": "0" + }, + { + "key": "Date", + "value": "Fri, 15 May 2026 08:42:42 GMT" + }, + { + "key": "Keep-Alive", + "value": "timeout=60" + }, + { + "key": "Connection", + "value": "keep-alive" + } + ], + "cookie": [], + "body": null + } + ] + }, + { + "name": "Delete EventImage Request", + "request": { + "method": "DELETE", + "header": [], + "url": { + "raw": "https://localhost:8443/api/v1/events/6/image", + "protocol": "https", + "host": [ + "localhost" + ], + "port": "8443", + "path": [ + "api", + "v1", + "events", + "6", + "image" + ] + } + }, + "response": [ + { + "name": "Delete EventImage Request", + "originalRequest": { + "method": "DELETE", + "header": [], + "url": { + "raw": "https://localhost:8443/api/v1/events/6/image", + "protocol": "https", + "host": [ + "localhost" + ], + "port": "8443", + "path": [ + "api", + "v1", + "events", + "6", + "image" + ] + } + }, + "status": "No Content", + "code": 204, + "_postman_previewlanguage": null, + "header": [ + { + "key": "X-Content-Type-Options", + "value": "nosniff" + }, + { + "key": "X-XSS-Protection", + "value": "0" + }, + { + "key": "Cache-Control", + "value": "no-cache, no-store, max-age=0, must-revalidate" + }, + { + "key": "Pragma", + "value": "no-cache" + }, + { + "key": "Expires", + "value": "0" + }, + { + "key": "Strict-Transport-Security", + "value": "max-age=31536000 ; includeSubDomains" + }, + { + "key": "X-Frame-Options", + "value": "DENY" + }, + { + "key": "Date", + "value": "Fri, 15 May 2026 08:43:33 GMT" + }, + { + "key": "Keep-Alive", + "value": "timeout=60" + }, + { + "key": "Connection", + "value": "keep-alive" + } + ], + "cookie": [], + "body": null + } + ] + }, + { + "name": "Edit EventImage Request", + "request": { + "method": "PUT", + "header": [], + "body": { + "mode": "formdata", + "formdata": [ + { + "key": "imageFile", + "type": "file", + "uuid": "85a8dfcd-c291-4f8b-ace4-25fe0f0227b2", + "src": "postman-cloud:///1f15035b-4202-43d0-bcd4-f21c70e0bf6c" + } + ] + }, + "url": { + "raw": "https://localhost:8443/api/v1/events/9/image", + "protocol": "https", + "host": [ + "localhost" + ], + "port": "8443", + "path": [ + "api", + "v1", + "events", + "9", + "image" + ] + } + }, + "response": [ + { + "name": "Edit EventImage Request", + "originalRequest": { + "method": "PUT", + "header": [], + "body": { + "mode": "formdata", + "formdata": [ + { + "key": "imageFile", + "type": "file", + "uuid": "85a8dfcd-c291-4f8b-ace4-25fe0f0227b2", + "src": "postman-cloud:///1f15035b-4202-43d0-bcd4-f21c70e0bf6c" + } + ] + }, + "url": { + "raw": "https://localhost:8443/api/v1/events/9/image", + "protocol": "https", + "host": [ + "localhost" + ], + "port": "8443", + "path": [ + "api", + "v1", + "events", + "9", + "image" + ] + } + }, + "status": "No Content", + "code": 204, + "_postman_previewlanguage": null, + "header": [ + { + "key": "X-Content-Type-Options", + "value": "nosniff" + }, + { + "key": "X-XSS-Protection", + "value": "0" + }, + { + "key": "Cache-Control", + "value": "no-cache, no-store, max-age=0, must-revalidate" + }, + { + "key": "Pragma", + "value": "no-cache" + }, + { + "key": "Expires", + "value": "0" + }, + { + "key": "Strict-Transport-Security", + "value": "max-age=31536000 ; includeSubDomains" + }, + { + "key": "X-Frame-Options", + "value": "DENY" + }, + { + "key": "Date", + "value": "Fri, 15 May 2026 08:44:31 GMT" + }, + { + "key": "Keep-Alive", + "value": "timeout=60" + }, + { + "key": "Connection", + "value": "keep-alive" + } + ], + "cookie": [], + "body": null + } + ] + }, + { + "name": "Get EventsByParticipant Request", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "https://localhost:8443/api/v1/events/?participantId=1", + "protocol": "https", + "host": [ + "localhost" + ], + "port": "8443", + "path": [ + "api", + "v1", + "events", + "" + ], + "query": [ + { + "key": "participantId", + "value": "1" + } + ] + } + }, + "response": [ + { + "name": "Get EventsByParticipant Request", + "originalRequest": { + "method": "GET", + "header": [], + "url": { + "raw": "https://localhost:8443/api/v1/events/?participantId=1", + "protocol": "https", + "host": [ + "localhost" + ], + "port": "8443", + "path": [ + "api", + "v1", + "events", + "" + ], + "query": [ + { + "key": "participantId", + "value": "1" + } + ] + } + }, + "status": "OK", + "code": 200, + "_postman_previewlanguage": null, + "header": [ + { + "key": "X-Content-Type-Options", + "value": "nosniff" + }, + { + "key": "X-XSS-Protection", + "value": "0" + }, + { + "key": "Cache-Control", + "value": "no-cache, no-store, max-age=0, must-revalidate" + }, + { + "key": "Pragma", + "value": "no-cache" + }, + { + "key": "Expires", + "value": "0" + }, + { + "key": "Strict-Transport-Security", + "value": "max-age=31536000 ; includeSubDomains" + }, + { + "key": "X-Frame-Options", + "value": "DENY" + }, + { + "key": "Content-Type", + "value": "application/json" + }, + { + "key": "Transfer-Encoding", + "value": "chunked" + }, + { + "key": "Date", + "value": "Fri, 15 May 2026 08:47:11 GMT" + }, + { + "key": "Keep-Alive", + "value": "timeout=60" + }, + { + "key": "Connection", + "value": "keep-alive" + } + ], + "cookie": [], + "body": "{\n \"content\": [\n {\n \"id\": 1,\n \"title\": \"Global Latin Music Festival\",\n \"description\": \"A large-scale live music festival bringing together leading Latin and international artists. The event includes full-stage performances, VIP fan zones, immersive lighting, food areas and a night focused on reggaeton, pop and flamenco fusion.\",\n \"category\": \"Music\",\n \"location\": \"Madrid, WiZink Center\",\n \"date\": \"2026-05-10\",\n \"time\": \"21:00\",\n \"basicPrice\": 80,\n \"vipPrice\": 250,\n \"availableBasicTickets\": 15000,\n \"availableVipTickets\": 1000,\n \"image\": true,\n \"participants\": [\n {\n \"id\": 1,\n \"name\": \"Edited Participant\",\n \"type\": \"Music Artist\",\n \"biography\": \"Puerto Rican global superstar known for redefining reggaeton and Latin trap, headlining major international festivals and sold-out world tours.\",\n \"participantImage\": true\n },\n {\n \"id\": 2,\n \"name\": \"Olivia Rodrigo\",\n \"type\": \"Music Artist\",\n \"biography\": \"Grammy-winning artist recognized for emotional songwriting, powerful vocals and chart-topping pop-rock performances.\",\n \"participantImage\": true\n }\n ],\n \"tickets\": []\n },\n {\n \"id\": 12,\n \"title\": \"New Event\",\n \"description\": \"New Event\",\n \"category\": \"New Event\",\n \"location\": \"Madrid, WiZink Center\",\n \"date\": \"2026-05-10\",\n \"time\": \"21:00\",\n \"basicPrice\": 80,\n \"vipPrice\": 250,\n \"availableBasicTickets\": 15000,\n \"availableVipTickets\": 1000,\n \"image\": false,\n \"participants\": [\n {\n \"id\": 1,\n \"name\": \"Edited Participant\",\n \"type\": \"Music Artist\",\n \"biography\": \"Puerto Rican global superstar known for redefining reggaeton and Latin trap, headlining major international festivals and sold-out world tours.\",\n \"participantImage\": true\n },\n {\n \"id\": 2,\n \"name\": \"Olivia Rodrigo\",\n \"type\": \"Music Artist\",\n \"biography\": \"Grammy-winning artist recognized for emotional songwriting, powerful vocals and chart-topping pop-rock performances.\",\n \"participantImage\": true\n }\n ],\n \"tickets\": []\n }\n ],\n \"page\": {\n \"size\": 20,\n \"number\": 0,\n \"totalElements\": 2,\n \"totalPages\": 1\n }\n}" + } + ] + } + ], + "variable": [ + { + "key": "baseURL", + "value": "", + "type": "default" + } + ] } \ No newline at end of file diff --git a/docs/detailed_functionalities.md b/docs/detailed_functionalities.md index 4f3e636..21e673c 100644 --- a/docs/detailed_functionalities.md +++ b/docs/detailed_functionalities.md @@ -1,43 +1,49 @@ -> The following functionalities are classified into three levels according to their relevance, complexity and impact on the system. This classification helps to clearly define the development priorities and considerations: +> The following functionalities are classified into three levels according to their relevance, complexity and impact on the system. Each functionality is marked as implemented (✅) or in progress (⏳). The functionality classification helps to clearly define the development priorities and considerations: ### 🥉 **Basic** > These functionalities represent the minimum required for the application to operate correctly and provide the event browsing and ticket management experience: -- **Anonymous User** 🕵️: +- ✅ **Anonymous User** 🕵️: - View and explore the main list of events. - View and explore the main list of participants. - - View detailed information about specific events (description, category, date, location, participants, image, reviews) and participants (description, category, image). -- **Registered User** 👤: - - Secure user registration and authentication. - - Explore and edit profile: personal details, image, email, purchase history, followed participants, favorites events. - - Purchase event tickets. - - Cancel previously purchased tickets. -- **Administrator User** 👑: - - Add, delete, and modify operations on Events. - - Add, delete, and modify operations on Participants. + - View detailed information about specific events, including title, description, category, date, location, time, prices, available tickets, image and associated participants. + - View detailed information about specific participants, including name, type, biography, image and events they are associated with. + +- ✅ **Registered User** 👤: + - Register, log in and log out securely. + - View and edit their own profile information, including fullname, email and phone number. + - Upload, update and delete their profile image. + - View their purchased tickets from the user profile page and their details such as number of tickets, event details, price and ticket type. + - Purchase event tickets, selecting the number of tickets and the ticket type (BASIC or VIP). + +- ✅ **Administrator User** 👑: + - Create, edit and delete events. + - Create, edit and delete participants. + - Upload, update and delete images for events and participants. ### 🥈 **Intermediate** > Functionalities that adds value and improves user experience: -- **Advanced Search** 🔎: +- ⏳ **Advanced Search** 🔎: - Filter events by category, date, participant and other event information. - Search through keyword search bar. - Combine multiple filters to refine results. -- **Review System** ⭐: +- ⏳ **Review System** ⭐: - **Registered User:** Add, modify, and delete their own reviews. - **Administrator User:** Manage and moderate user generated reviews. -- **Image Upload** 🖼️: - - Upload and update profile images for registered users and participants. - - Upload event promotional posters and images. -- **Statistics Charts** 📊: +- ✅ **Image Upload** 🖼️: + - Registered users can upload, update and delete their profile image. + - Administrators can upload, update and delete images for events and participants. + - Images are stored in the database. +- ⏳ **Statistics Charts** 📊: - Bar chart displaying the number of tickets sold per event. - Pie chart that categorizes sales based on event types. -- **Help** ❓: +- ⏳ **Help** ❓: - Implementation of a help center that includes a FAQ section with common questions and issues. -- **Social Interaction** ❤️: +- ⏳ **Social Interaction** ❤️: - Functionality for registered users to save and manage a personalized list of favorite events. - Functionality for registered users to follow participants to receive upcoming events and other information. @@ -45,22 +51,22 @@ > Functionality that allows obtaining the final version of the application, which are more complex, requiring algorithmic implementation, additional technologies or external service integration: -- **Personalized Recommendation System** 🧠: +- ⏳ **Personalized Recommendation System** 🧠: - Algorithm that generates personalized event feeds for each user, by analyzing user preferences based on: - Previously consumed genres or categories. - Event popularity metrics like number of tickets sold or rating. -- **Digital Ticketing (PDF)** 📄: +- ⏳ **Digital Ticketing (PDF)** 📄: - Automatic generation of tickets in PDF format after successful purchase. -- **Email Service** 📧: +- ⏳ **Email Service** 📧: - Allow users to contact support through email. - Sends automated emails to users (purchase confirmations, reminders). -- **Geolocation** 🗺️: +- ⏳ **Geolocation** 🗺️: - Use of Google Maps/OpenStreetMap for event location display. -- **Real-Time Notifications** 🔔: +- ⏳ **Real-Time Notifications** 🔔: - Implementation of WebSocket for live alerts (sold-out tickets, newly added events). -- **Simulated Tickets Payment** 🔄: +- ⏳ **Simulated Tickets Payment** 🔄: - Implementation of a simulated payment gateway system to simulate a secure payment process. -- **Sentiment Analysis (AI Rating)** 🤖: +- ⏳ **Sentiment Analysis (AI Rating)** 🤖: - Automatic processing of user reviews in events by using NLP (Natural Language Processing) to classify comments. The process works as follows: - Each comment receives a sentiment label (Positive, Neutral or Negative), a sentiment score (0.00-1.00) and an AI rating based on the review. - The interface displays and compares both user rating and AI rating for error detection and to improve the recommendation system. diff --git a/docs/development_guide.md b/docs/development_guide.md index 58b9c19..e69de29 100644 --- a/docs/development_guide.md +++ b/docs/development_guide.md @@ -1,337 +0,0 @@ -# Index - - - [Introduction](#introduction) - - [Technologies](#technologies) - - [Tools](#tools) - - [Architecture](#architecture) - - [Quality Control](#quality-control) - - [Development Process](#development-process) - - [Code Edit & Execution](#code-edit--execution) - -## Introduction - -> **GoEventsNow** is a full-stack web application designed following a SPA (Single Page Application) architecture. In this architecture, the frontend is responsible for rendering the user interface dynamically as the user interacts with it, obtaining the data when the backend exposes with a REST API that handles the application logic and data persistence. - -The application is divided into three main layers: - -- **Client (Frontend)**: Implemented using Angular, it manages user interaction, navigation, and dynamic content rendering. It communicates with the backend via HTTP requests. -- **Server (Backend)**: Developed using Spring Boot (Java), the backend provides a REST API that manages business logic and exposes the data obtained from the Database. -- **Database (Persistence)**: A MySQL relational database is used to ensure storage and persistence of application data. - -| Concept | Description | -| :--- | :--- | -| **Type** | Web Application SPA (Single Page Application) + REST API | -| **Technologies** | **Backend**: Spring Boot, Java 21. **Frontend**: Angular, TypeScript, HTML, CSS. **Database**: MySQL | -| **Tools** | VsCode, Maven, Git, Postman | -| **Quality Control** | **Tests**: Unit, Integration and System (JUnit, REST Assured, Selenium). **Coverage**: JaCoCo and Vitest. **Analysis**: Static code with Sonar | -| **Deployment** | Docker (no implemented yet, but planned for future phases) | -| **Development process** | Iterative and Incremental methodology using GitFlow and GitHub Actions for CI | - -## Technologies - -> Main technologies used for the execution of the project, with a description about the purpose in the project and its official URLs. - -- **Java 21**: Programming language used for the backend logic and REST API implementation. - Official URL: [https://www.oracle.com/java/](https://www.oracle.com/java/) - -- **Spring Boot**: Java framework used to create the backend. It manages the application logic, handles the main functionalities and entities, and provides data to the Angular frontend through the REST API. - Official URL: [https://spring.io/projects/spring-boot](https://spring.io/projects/spring-boot) - -- **Angular**: Frontend framework for building the Single Page Application (SPA). It manages client-side routing, dynamic content rendering and HTTP communication with the backend API. - Official URL: [https://angular.dev/](https://angular.dev/) - -- **MySQL**: Relational database used for persistent storage of events, ensuring data integrity. - Official URL: [https://www.mysql.com/](https://www.mysql.com/) - -- **TypeScript**: Programming language used in the frontend to add components, model and services. - Official URL: [https://www.typescriptlang.org/](https://www.typescriptlang.org/) - -# Tools - -> Main tools and IDEs used during development. - -- **Visual Studio Code**: Code editor used for both Backend/Frontend development. - Official URL: [https://code.visualstudio.com/](https://code.visualstudio.com/) - -- **Postman**: Tool for testing and documenting REST API endpoints. - Official URL: [https://www.postman.com/](https://www.postman.com/) - -- **Git**: Version control system used to track changes in source code, in addition to manage the tasks development and the implementation of GitFlow workflows. - Official URL: [https://github.com/](https://github.com/) - -- **Maven**: Build automation tool used to manage the backend dependencies and lifecycle of the Java application. - Official URL: [https://maven.apache.org/](https://maven.apache.org/) - -- **Figma**: Interface design tool used to create the screen mockups and navigation flows defined in the analysis phase. - Official URL: [https://www.figma.com/](https://www.figma.com/) - -## Architecture - -### Deployment - -> The deployment architecture is based on independent processes communicating through HTTP following the REST API architectural style: - -The application is deployed as several independent processes: - -1. Frontend (Port 4200): It handles the user interface and presentation logic. It communicates with the backend via HTTP communication and using JSON as the data interchange format. - -2. Backend (Port 8080): The Spring Boot application runs on the server, and it acts as a REST API that handles the business logic and data persistence. It communicates with the Database to obtain data, and with the Frontend to listen the requests. - -3. MySQL (Port 3306): The MySQL database runs, ensuring data integrity and persistence. It allows the communication with the backend to send data, ensuring security. - -### REST API - -> The communication between the Client and the Server is documented using OpenAPI and served as a web page using [https://raw.githack.com](https://raw.githack.com). - -- You can view the complete and interactive API documentation here: [OpenAPI HTML Documentation](https://raw.githack.com/codeurjc-students/2025-GoEventsNow/main/backend/docs/api/api-docs.html) - -## Quality Control - -> This section details the quality controls and automated tests implemented during this stage of development to ensure the reliability and correctness of the application. - -### Automated Tests - -> The project includes automated tests at different levels to verify the functionality and effectiveness of both backend and frontend. The following table summarizes the types of tests implemented, the technologies used and their descriptions: - -| Test Type | Technology | Description & Traceability | -| :--- | :--- | :--- | -| Unit (Server) | JUnit / Mockito | EventTest.java - Tests basic functionalities implemented in EventService, such as GET and POST operations for events. **Traceability**: Verifies Objective#2 (Content Control) and Objective#1 (Discovery) | -| Unit (Client) | Vitest / TestBed | app.component.spec.ts - Tests the component and data rendering using mocks. **Traceability**: Verifies Objective#1 (Discovery) | -| Integration (Server) | JUnit / Spring Boot | EventBBDDTest.java - Test the repository persistence and the database interaction. **Traceability**: Verifies Objective#2 (Content Control) persistence | -| Integration (Client) | HttpClient | event.service.spec.ts - Test the frontend service communication and HTTP response handling. **Traceability**: Ensures data flow for Objective#1 | -| System (Server) | Rest Assured | EventApiTest.java - Test the REST API, verifying status codes and JSON response. **Traceability**: Verifies for all Objectives | -| System (Client) | Selenium Webdriver | SeleniumTest.java - E2E testing simulating a real user navigation flow in the the main page in Headless Chrome. **Traceability**: Verifies Objective#1 (Discovery) flow | - -### Test Statistics - -> This section summarizes the results obtained from the execution of the automated tests implemented in the project, including the number of tests executed, coverage percentages and results. - -| Test Type | Total Tests | Passed | Failed | Coverage (%) | -| :--- | :---: | :---: | :---: | :---: | -| Unit (Server) | 2 | 2 | 0 | 100% (Service) / 23% (Controller) | -| Unit (Client) | 3 | 3 | 0 | 94.73% | -| Integration (Server) | 2 | 2 | 0 | Included in total | -| Integration (Client) | 1 | 1 | 0 | 100% | -| System (Server) | 1 | 1 | 0 | N/A | -| System (Client) | 1 | 1 | 0 | N/A | -| Server Total | 7 | 7 | 0 | 74% | -| Client Total | 4 | 4 | 0 | 95.65% | - -#### Backend Test Execution & Code Coverage Report (JaCoCo) - -![Backend Tests](https://github.com/user-attachments/assets/9449c4c2-5d3c-4dcc-a4e7-8bd5c76e0bdb) - -![Backend Coverage](https://github.com/user-attachments/assets/7aa5c878-ddbf-4c90-9879-b20cc7fb9360) - -#### Frontend Test Execution & Code Coverage Report (Vitest) - -![Frontend Tests & Coverage](https://github.com/user-attachments/assets/9c0226dc-930e-40c0-833f-e97e56b10db0) - -### Static Code Analysis - -> The project uses SonarCloud to perform static code analysis, identifying code smells, bugs and security vulnerabilities. The following table summarizes the main metrics obtained from the analysis, including number of classes, lines of code, etc. - -| Metric | Count | Rating | -| :--- | :---: | :---: | -| Lines of Code | 3.3k | - | -| Reliability | 3 | B | -| Security | 1 | E | -| Maintainability | 12 | A | -| Security Hotspots | 1 | - | -| Duplicated Lines (%) | 0.0% | - | - -![SonarCloud Analysis](https://github.com/user-attachments/assets/f57bbe34-4abf-45fc-bab7-31c10b3a46c2) - -## Development Process - -> The project follows an iterative and incremental process based on Agile principles, incorporating Extreme Programming (XP) practices like CI and Kanban (GitHub Project) for workflow management. - -### Task Management - -> Managed through GitHub Projects (Kanban board) to organize and prioritize the GitHub Issues created for the development of new features, bug fixes and improvements. - -### Git Strategy - -> The project uses GitHub as the version control platform, implementing GitFlow as the branching strategy to manage the development process effectively. There are several types of branches used to organize the work: - -- main: Stable production code. -- develop: Integration branch to develop new features or to fix errors. -- feature/**: Branch to add and develop new functionalities. -- fix/**: Branch to update and correct previous functionalities already created. - -### Git Metrics - -- Number of Commits: 73 commits made. -- Number of Branches: Not more than 4 at the same time (Main, Develop, Feature/** or Fix/** ). -- Number of Pull Requests: 20 Pull Requests made. - -### Continuous Integration (CI) - -> The CI workflows are implemented using GitHub Actions to automate the building, testing and quality control of the project, ensuring that both frontend and backend code is correct before merging into the main branch. There are 2 different types of workflows made, depending on the kind of tests they analyze and when its applied. - -#### Workflow: CI - Basic (Basic Quality Control) - -> Runs on every commit made in a feature/fix branch to ensure that changes do not break the application and its tests. - -- Job: - - Backend (Server) + Frontend (Client) + Sonar (Static Code Analysis): - - Objective: Compile backend, build frontend, generate code coverage, static code analysis and run unit tests. - - Steps: - 1. Set up the MySQL database. - 2. Checkout repository. - 3. Set up JDK 21 (Temurin distribution). - 4. Compile backend and run unit test (`EventTest`) using Maven. - 5. Set up Node.js 20 with npm. - 6. Install all dependencies. - 7. Build Angular project in production mode. - 8. Run frontend unit tests (`app.component.spec.ts`) with code coverage. - 9. Execute sonar-scanner for static code analysis. - -#### Workflow: CI - Complete (Complete Quality Control) - -> Runs on Pull Request made on a feature branch, with base in the main branch. - -- Job: - - Objective: Run unit, integration and system tests for both backend and frontend, and static code analysis. - - Steps: - 1. Set up MySQL database. - 2. Checkout repository. - 3. Set up JDK 21 and Node.js 20. - 4. Install all frontend dependencies. - 5. Compile backend and run unit & integration tests (`EventTest`, `EventBBDDTest`). - 6. Run frontend unit & integration tests (`app.component.spec.ts`, `event.service.spec.ts`) - 7. Install wait tools to check port availability. - 8. Execute sonar-scanner for static code analysis. - 9. Start backend and wait for port 8080. - 10. Start frontend and wait for port 4200. - 11. Run system tests: - - Backend (Server): API tests using REST Assured (`EventApiTest`). - - Frontend (Client): Selenium e2e test (`SeleniumTest`). - -## Code Edit & Execution - -> This section provides instructions to clone the repository, execute the application locally, the tools used during development, and how to run the tests implemented. - -### Cloning the Repository - -> To clone the project repository, ensure you have Git installed. Then use the following command in your terminal or command prompt: - -```bash -git clone https://github.com/codeurjc-students/2025-GoEventsNow -``` - -### Execution - -> The application requires a MySQL server installed and running on your local machine. You can use the following credentials to connect to the database or start one using Docker: - -```bash -docker run --name goeventsnow-db -e MYSQL_ROOT_PASSWORD=password -e MYSQL_DATABASE=goeventsnow_db -p 3306:3306 -d mysql:8 -``` - -- Database Name: `goeventsnow_db` -- Username/Password: Ensure they match the configuration in the `application.properties` file of the backend. In the default configuration, it uses `root` as username and `password` as password. - -> You can execute the backend and start the Spring Boot application: - -```bash -cd backend -mvn spring-boot:run -``` -The backend will start on port 8080. - -> In a separate terminal, launch the frontend Angular application: - -```bash -cd frontend -npm install ## Only the first time used -npm start -``` -The frontend will start on port 4200. - -### Accessing the Application - -> Once both backend and frontend are running, you can access the application through your web browser: - -Access the application at: http://localhost:4200/. - -### CI Workflows - -> The CI workflows are defined in the `.github/workflows/` directory of the repository. It contains two main workflows files and they can only be run depending on the trigger. - -- `basic-quality.yml`: This workflow runs on every commit to a feature/fix branch, performing basic quality control by compiling the backend, building the frontend, running unit tests, and performing static code analysis with SonarCloud. -- `complete-quality.yml`: This workflow runs on pull requests to the main branch, executing a complete quality control process that includes unit, integration, and system tests for both backend and frontend, including code analysis with SonarCloud. - -### Used Tools - -> This section describes the main tools used during development for code editing, testing and interaction with the application. - -- IDEs (Visual Studio Code): Use of Visual Studio Code for both backend and frontend development, providing a unified environment for coding, debugging and testing. It offers extensions for Java, Angular, and Docker, facilitating the development process. -- Postman: Used to test and interact with the REST API. -- Browser: To access to the application at the port previously commented. - -### API Interaction (Postman) - -> Postman is used to test and interact with the REST API provided by the backend. This allows to verify the endpoints, check JSON responses and simulate requests. - -**How to use Postman:** -1. Download and install Postman from [https://www.postman.com/](https://www.postman.com/). -2. Open Postman and create a new request. -3. Set the request method (GET, POST, etc.) and the URL (e.g., `http://localhost:8080/api/v1/events/`). -4. Add any necessary headers or body data for the request. -5. Send the request and review the response from the server. - -**Collection File:** -- You can find the Postman collection file generated here: [GoEventsNow Postman Collection](GoEventsNow_Collection.postman_collection.json). - -### Test Execution - -> This section describes the steps to execute the automated tests implemented in the project for both backend and frontend. - -#### Backend Tests - -> To run all the backend tests, ensure you have Maven installed. Then execute the following commands: - -```bash -cd backend -mvn clean verify -``` -This command will run all the unit, integration, and system tests defined in the backend. - -> To run a specific test, use the following command, replacing `TEST_CLASS_NAME` with the name of the test class you want to execute: - -```bash -cd backend -mvn test -Dtest="${TEST_CLASS_NAME}" -``` - -#### Frontend Tests - -> To run all the frontend tests, ensure you have Node.js and npm installed. Then execute the following command: - -```bash -cd frontend -npm test -``` -This command will run all the unit, integration, and system tests defined in the frontend. - -> To run the frontend tests with code coverage, use the following command: - -```bash -cd frontend -ng test --coverage -``` - -This will generate a coverage report you can view by opening: `frontend/coverage/index.html` in your web browser. - -### Release - -> The project uses GitHub releases to package stable versions of the application. - -The release process follows these steps: -1. Ensure that all tests are passing and the code is stable. -2. Create a new release in GitHub, providing a version number and description of the changes included in the release. -3. The release will be tagged in the repository, and you can download the source code. - -You can find the list of releases here: -[GoEventsNow Releases](https://github.com/codeurjc-students/2025-GoEventsNow/releases) - diff --git a/docs/execution.md b/docs/execution.md new file mode 100644 index 0000000..ca6bda4 --- /dev/null +++ b/docs/execution.md @@ -0,0 +1,103 @@ +# 🚀 Execution Guide + +> This section explains how to execute the application using Docker, including the requirements and the steps to run the application from the published Docker Compose in DockerHub. It also provides instructions for running the application locally using Docker Compose. + +## Requirements + +> To run the application, Docker must be installed. + +- On Windows, Docker Desktop is required: https://docs.docker.com/desktop/setup/install/windows-install/ +- On macOS, Docker Desktop is required: https://docs.docker.com/desktop/setup/install/mac-install/ +- On Linux, Docker Engine and Docker Compose are required: + - Docker Engine: https://docs.docker.com/engine/install/ + - Docker Compose plugin: https://docs.docker.com/compose/install/linux/ + +> To download the Docker Compose artifact published as an OCI artifact, ORAS is also required: + +- ORAS installation: https://oras.land/docs/installation/ +- On Windows, ORAS can be installed with: + +```powershell +winget install oras +``` + +## Running the application from DockerHub Compose OCI artifact + +> Create an empty folder and move into it: + +```bash +mkdir goeventsnow-run +cd goeventsnow-run +``` + +> Download the Docker Compose file published in DockerHub: + +```bash +oras pull docker.io/albertoml1999/goeventsnow-app-compose:0.1.0 +``` + +> Start the application: + +```bash +docker compose -f docker/docker-compose.yml up -d +``` + +> This starts two containers: + +- `goeventsnow-app`: the Spring Boot backend with the Angular frontend served as static resources. +- `goeventsnow-db`: the MySQL database used by the application. + +> To check that both containers are running: + +```bash +docker ps +``` + +> The application will be available at: + +```text +https://localhost +``` + +> To stop the application: + +```bash +docker compose -f docker/docker-compose.yml down +``` + +## Alternative execution using the Docker image + +> The application image can also be pulled directly from DockerHub: + +```bash +docker pull albertoml1999/goeventsnow-app:0.1.0 +``` + +> However, the application requires a MySQL database, so the recommended way to run it is through Docker Compose. + +> If the repository is cloned locally, it can be executed with: + +```bash +docker compose -f docker/docker-compose.yml up -d +``` + +> The image used by this compose file is: + +```text +albertoml1999/goeventsnow-app:0.1.0 +``` + +## Access credentials and sample data + +> The application includes two example users: + +- Username: `admin` / Password: `adminpass`: Administrator user access for managing events and participants. +- Username: `user` / Password: `pass`: Registered user access for viewing the profile and purchasing tickets. + +> Anonymous users can browse the events and participants list and details without logging in. + +> The backend also loads sample data in the database to show the main application features, including: + +- Events from several categories, such as music, sports, cinema, technology, comedy and gastronomy. +- Participants linked to those events, including artists, athletes, actors, chefs and technology speakers. +- Images for events and participants associated with them. \ No newline at end of file diff --git a/docs/functionalities.md b/docs/functionalities.md new file mode 100644 index 0000000..af1c477 --- /dev/null +++ b/docs/functionalities.md @@ -0,0 +1,107 @@ + +### 🕵️ Anonymous User + +> Anonymous users can browse the main content of the application without registering or logging in, but they have limited access to functionalities compared to registered users and administrators. The functionalities available to anonymous users include: + +#### Main page + +![Main page]() + +Anonymous users can access the main page of the application, which provides an overview of the trending events and participants, as well as a search bar and navigation header to explore the content. + +#### Event Listing + +![Event list]() + +Anonymous users can view and explore all available events. + +#### Participant Listing + +![Participant list]() + +Anonymous users can view and explore all available participants. + +#### Event details + +![Event detail]() + +Anonymous users can view detailed information about specific events, including title, description, category, date, location, time, prices, available tickets, image and associated participants. + +#### Participant details + +![Participant detail]() + +Anonymous users can view detailed information about participants, including name, type, biography, image and the events they are associated with. + +--- + +### 👤 Registered User + +> Registered users can access additional functionalities after logging in. + +#### Register + +![Register page]() + +Anonymous users can register to create a new account. + +#### Log In + +![Login page]() + +Anonymous users can log in to access additional functionalities by providing their email and password. + +#### Log Out + +![Logout]() + +Registered users can log out of their account. + +#### User profile (Edit profile) + +![User profile]() + +Registered users can view and edit their personal information, including fullname, email and phone number. + +#### User profile (Purchased tickets) + +![Purchased tickets]() + +Registered users can view their purchased tickets from the user profile page, including event details, price and ticket type. + +#### Ticket purchase + +![Ticket purchase]() + +Registered users can purchase event tickets by selecting the number of tickets and the ticket type (BASIC OR VIP). + +--- + +### 👑 Administrator User + +> Administrator users can manage the events and participants in the application. + +#### Event management + +![Event management]() + +Administrators can create, edit and delete events. + +#### Participant management + +![Participant management]() + +Administrators can create, edit and delete participants. + +#### Event Creation/Edition Form + +![Event creation/edition form]() + +Administrators can use this form to create new events or edit existing ones. + +#### Participant Creation/Edition Form + +![Participant creation/edition form]() + +Administrators can use this form to create new participants or edit existing ones. + From 1c29122d979e176cc30439971c03b0de5734429a Mon Sep 17 00:00:00 2001 From: AlbertoML1999 Date: Fri, 15 May 2026 20:47:31 +0200 Subject: [PATCH 2/5] docs: enhance development guide with detailed sections on technologies, tools, architecture, quality control, docker deployment, and development process --- docs/development_guide.md | 818 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 818 insertions(+) diff --git a/docs/development_guide.md b/docs/development_guide.md index e69de29..2af3bae 100644 --- a/docs/development_guide.md +++ b/docs/development_guide.md @@ -0,0 +1,818 @@ +# Index + + - [Introduction](#introduction) + - [Technologies](#technologies) + - [Tools](#tools) + - [Architecture](#architecture) + - [Quality Control](#quality-control) + - [Docker Deployment](#docker-deployment) + - [Development Process](#development-process) + - [Code Edit & Execution](#code-edit--execution) + +## Introduction + +> **GoEventsNow** is a full-stack web application designed following a SPA (Single Page Application) architecture. In this architecture, the frontend is responsible for rendering the user interface dynamically as the user interacts with it, obtaining the data when the backend exposes with a REST API that handles the application logic and data persistence. + +> In this phase, the project includes a stable minimum viable product (MVP) with core functionalities such as user registration, log in/logout, event and participant browsing and management for administrators, detailed event and participant pages, images handling, and ticket purchasing. + +The application is divided into three main layers: + +- **Client (Frontend)**: Implemented using Angular, it manages user interaction, navigation, and dynamic content rendering. It communicates with the backend via HTTP requests. +- **Server (Backend)**: Developed using Spring Boot (Java), the backend provides a REST API that manages business logic and exposes the data obtained from the Database. +- **Database (Persistence)**: A MySQL relational database is used to ensure storage and persistence of application data. + +| Concept | Description | +| :--- | :--- | +| **Type** | Web Application SPA (Single Page Application) + REST API. | +| **Technologies** | **Backend**: Java 21, Spring Boot, Spring Security + JWT, Spring Data JPA, Bean Validation, MapStruct, OpenAPI. **Frontend**: Angular 21, TypeScript, Bootstrap, ng-bootstrap, RxJS. **Database**: MySQL | +| **Tools** | VS Code, Maven, Git/GitHub, Postman, Docker/Docker Compose, DockerHub, ORAS, SonarCloud, GitHub Actions | +| **Quality Control** | **Tests**: Unit, Integration and System (JUnit, REST Assured, Selenium) for backend and frontend (TestBed / Vitest). **Coverage**: JaCoCo and Vitest. **Analysis**: Static code with Sonar | +| **Deployment** | Docker image published in DockerHub. Execution with Docker Compose using MySQL container and the application container. Docker Compose is also published as an OCI artifact. | +| **Development process** | Iterative and Incremental methodology using GitFlow and GitHub Actions for CI/CD. | + +## Technologies + +> Main technologies used for the execution of the project, with a description about the purpose in the project and its official URLs. + +- **Java 21**: Programming language used for the backend logic and REST API implementation. + Official URL: [https://www.oracle.com/java/](https://www.oracle.com/java/) + +- **Spring Boot**: Java framework used to create the backend. It manages the application logic, handles the main functionalities and entities, and provides data to the Angular frontend through the REST API. + Official URL: [https://spring.io/projects/spring-boot](https://spring.io/projects/spring-boot) + +- **Spring Security + JWT**: Used to secure the REST API and manage user authentication and authorization. + Official URLs: [https://spring.io/projects/spring-security](https://spring.io/projects/spring-security), [https://jwt.io/](https://jwt.io/) + +- **Spring Data JPA**: Used to implement the persistence layer and database access through repositories and entity mappings. + Official URL: [https://spring.io/projects/spring-data-jpa](https://spring.io/projects/spring-data-jpa) + +- **Bean Validation**: Used to validate DTOs and incoming data before processing them in the backend. + Official URL: [https://beanvalidation.org/](https://beanvalidation.org/) + +- **MapStruct**: Used to map entities and DTOs in the backend. + Official URL: [https://mapstruct.org/](https://mapstruct.org/) + +- **Angular**: Frontend framework for building the Single Page Application (SPA). It manages client-side routing, dynamic content rendering and HTTP communication with the backend API. + Official URL: [https://angular.dev/](https://angular.dev/) + +- **MySQL**: Relational database used for persistent storage of events, ensuring data integrity. + Official URL: [https://www.mysql.com/](https://www.mysql.com/) + +- **TypeScript**: Programming language used in the frontend to add components, model and services. + Official URL: [https://www.typescriptlang.org/](https://www.typescriptlang.org/) + +- **OpenAPI / Swagger UI**: Used to generate and visualize REST API documentation. + Official URL: [https://springdoc.org/](https://springdoc.org/),[https://swagger.io/tools/swagger-ui/](https://swagger.io/tools/swagger-ui/) + +- **Bootstrap / ng-bootstrap**: CSS framework and Angular components for building Bootstrap components adapted for Angular. + Official URLs: [https://getbootstrap.com/](https://getbootstrap.com/), [https://ng-bootstrap.github.io/](https://ng-bootstrap.github.io/) + +## Tools + +> Main tools and IDEs used during development. + +- **Visual Studio Code**: Code editor used for both Backend/Frontend development. + Official URL: [https://code.visualstudio.com/](https://code.visualstudio.com/) + +- **Postman**: Tool for testing and documenting REST API endpoints. + Official URL: [https://www.postman.com/](https://www.postman.com/) + +- **Git**: Version control system used to track changes in source code, in addition to manage the tasks development and the implementation of GitFlow workflows. + Official URL: [https://github.com/](https://github.com/) + +- **GitHub Actions**: CI/CD platform used to automate build deployment, test and quality-control workflows for backend and frontend. + Official URL: [https://github.com/features/actions](https://github.com/features/actions) + +- **Maven**: Build automation tool used to manage the backend dependencies and lifecycle of the Java application. + Official URL: [https://maven.apache.org/](https://maven.apache.org/) + +- **Docker + Docker Compose**: Containerization tools used to package and execute the application with MySQL in reproducible environments. + Official URLs: [https://www.docker.com/](https://www.docker.com/), [https://docs.docker.com/compose/](https://docs.docker.com/compose/) + +- **DockerHub**: Container registry used to publish the GoEventsNow application image and the Docker Compose OCI artifact. + Official URL: [https://hub.docker.com/](https://hub.docker.com/) + +- **ORAS**: OCI artifact client used to pull the published Docker Compose artifact from DockerHub. + Official URL: [https://oras.land/](https://oras.land/) + +- **SonarCloud**: Static code analysis platform used to monitor code quality and maintainability. + Official URL: [https://sonarcloud.io/](https://sonarcloud.io/) + +- **Figma**: Interface design tool used to create the screen mockups and navigation flows defined in the analysis phase. + Official URL: [https://www.figma.com/](https://www.figma.com/) + +- **Lucidchart**: Diagramming tool used to create the architecture diagrams for the backend and frontend. + Official URL: [https://www.lucidchart.com/](https://www.lucidchart.com/) + +## Architecture + +### Deployment + +> The deployment architecture is based on independent processes communicating through HTTP following the REST API architectural style: + +The application is deployed locally as several independent processes: + +1. Frontend (Port 4200): It handles the user interface and presentation logic. It communicates with the backend via HTTP communication and using JSON as the data interchange format. + +2. Backend (Port 8443): The Spring Boot application runs on the server, and it acts as a REST API that handles the business logic and data persistence. It communicates with the Database to obtain data, and with the Frontend to listen the requests. + +3. MySQL (Port 3306): The MySQL database runs, ensuring data integrity and persistence. It allows the communication with the backend to send data, ensuring security. + +### Domain Model + +> The domain model of the application is based on the main entities, such as User, Event, Participant and Ticket, and their relationships. The User entity represents the users of the application, the Event entity represents the events available in the platform, the Participant entity represents the participants of the events, and the Ticket entity represents the tickets purchased by users for specific events. + +[NEED TO INSERT DOMAIN MODEL DIAGRAM] + +### REST API + +> The communication between the frontend and backend is facilitated through a REST API. It follows RESTful principles and is secured with Spring Security for authentication and providing role-based access control. + +#### Swagger / OpenAPI Documentation + +> The API is fully documented using OpenAPI and Swagger UI, providing interactive documentation to understand and test the endpoints. The documentation includes details about each endpoint, such as request parameters or response formats. + +- **Swagger UI**: Available at `https://localhost:8443/swagger-ui/index.html#/` when running the backend locally. Available at `https://localhost/swagger-ui/index.html#/` when running with Docker. +- **OpenAPI Specification (YAML)**: Available at `https://localhost:8443/v3/api-docs.yaml`, or available at `https://localhost/v3/api-docs.yaml` when running the application with Docker. +- **Published HTML Documentation**: [OpenAPI HTML Documentation](https://raw.githack.com/codeurjc-students/2025-GoEventsNow/main/backend/docs/api/api-docs.html) (GitHub-hosted) + +#### API Base Configuration + +- **Base URL with Docker**: `https://localhost/api/v1` +- **Base URL with local backend**: `https://localhost:8443/api/v1` +- **Authentication**: JWT-based authentication using secure cookies. +- **Response Format**: JSON + +#### Authentication Endpoints + +| Method | Route | Description | Authentication | +| :--- | :--- | :--- | :--- | +| POST | `/auth/login` | User login with credentials | None | +| POST | `/auth/register` | User registration | None | +| POST | `/auth/refresh` | Refresh authentication token using refresh token cookie | Refresh Token | +| POST | `/auth/logout` | User logout | None | + +#### Events Endpoints + +| Method | Route | Description | Authentication | +| :--- | :--- | :--- | :--- | +| GET | `/events/` | Get all events (paginated) | None | +| GET | `/events/?participantId={participantId}` | Get all events filtered by participant ID (paginated) | None | +| GET | `/events/{id}` | Get event details by ID | None | +| POST | `/events/` | Create new event | Admin only | +| PUT | `/events/{id}` | Update event | Admin only | +| DELETE | `/events/{id}` | Delete event | Admin only | +| POST | `/events/{id}/image` | Upload event image | Admin only | +| PUT | `/events/{id}/image` | Update event image | Admin only | +| DELETE | `/events/{id}/image` | Delete event image | Admin only | +| GET | `/events/{id}/image` | Get event image | None | + +#### Participants Endpoints + +| Method | Route | Description | Authentication | +| :--- | :--- | :--- | :--- | +| GET | `/participants/` | Get all participants (paginated) | None | +| GET | `/participants/{id}` | Get participant details by ID | None | +| POST | `/participants/` | Create new participant | Admin only | +| PUT | `/participants/{id}` | Update participant | Admin only | +| DELETE | `/participants/{id}` | Delete participant | Admin only | +| POST | `/participants/{id}/image` | Upload participant image | Admin only | +| PUT | `/participants/{id}/image` | Update participant image | Admin only | +| DELETE | `/participants/{id}/image` | Delete participant image | Admin only | +| GET | `/participants/{id}/image` | Get participant image | None | + +#### Users Endpoints + +| Method | Route | Description | Authentication | +| :--- | :--- | :--- | :--- | +| GET | `/users/me` | Get current authenticated user profile | User/Admin | +| GET | `/users/exists?username={username}` | Check if a username already exists | None | +| PUT | `/users/{id}` | Update user profile | User/Admin (own profile only) | +| GET | `/users/{id}/image` | Get user profile photo | User/Admin (own profile only) | +| POST | `/users/{id}/image` | Upload user profile photo | User/Admin (own profile only) | +| PUT | `/users/{id}/image` | Update user profile photo | User/Admin (own profile only) | +| DELETE | `/users/{id}/image` | Delete user profile photo | User/Admin (own profile only) | + +#### Tickets Endpoints + +| Method | Route | Description | Authentication | +| :--- | :--- | :--- | :--- | +| GET | `/tickets/` | Get user's tickets (paginated) | User/Admin | +| GET | `/tickets/{id}` | Get specific ticket details | User/Admin | +| POST | `/tickets/` | Purchase/create new ticket | User/Admin | + +#### API Testing + +- **Postman Collection**: Use the provided [GoEventsNow Postman Collection](GoEventsNow_Collection.postman_collection.json) to test all endpoints +- **Swagger UI**: Testing directly available from the browser. + +### Server Architecture + +> The backend architecture is based on a layered structure based on the principles of separation of responsibilities. The main layers, their responsibilities and the connections between them are: + +1. **Controller Layer**: It contains the REST controllers to handle incoming HTTP requests, make the service calls, and return appropriate HTTP responses. It also manages authentication and authorization using Spring Security. It contains SpaController to serve the Angular frontend as static resources. +2. **Service Layer**: It contains the business logic of the application and the interaction with the persistence layer. +3. **Persistence/Repository Layer**: It manages the interaction with the MySQL database using Spring Data JPA repositories, ensuring data integrity. +4. **Model Layer**: It contains the entities that represent the application's domain objects. +5. **Security Layer**: It manages the security configuration, including JWT authentication and role-based access control. + +[NEED TO INSERT BACKEND ARCHITECTURE DIAGRAM] + +### Client Architecture + +> The frontend architecture is based on Angular's component-based structure, following best practices for separation of responsibilities. The main layers and their responsibilities are: + +1. **Components**: They are responsible for the presentation of the application and the features related to user interaction. They manage the views and templates, and they call the services to obtain data from the backend and render it in the UI. +2. **Services**: They manage the communication with the backend REST API. + +[NEED TO INSERT FRONTEND ARCHITECTURE DIAGRAM] + +## Quality Control + +> This section details the quality controls and automated tests implemented during this stage of development to ensure the reliability and effectiveness of the application. + +### Automated Tests + +> The project includes automated tests for both backend and frontend, covering unit, integration and system levels. These tests were developing to validate the functionalities implemented, ensuring that the application behaves as expected. + +#### Backend Tests + +| Test Level | Test Class | Technology | Description | Traceability | +| :--- | :--- | :--- | :--- | :--- | +| **Unit (Services)** | `EventServiceTest.java` | JUnit / Mockito | Verifies event service behavior: pagination, get-by-id, filtering by participant, create/update/delete flows and validation. | F1 Discovery & Search, F5 Content Control, T3 Automated Testing | +| | `UserServiceTest.java` | JUnit / Mockito | Tests user profile updates, user retrieval and role/authorization-related logic. | F2 User Activity, T3 Automated Testing | +| | `ParticipantServiceTest.java` | JUnit / Mockito | Verifies participant service behavior: create/update/delete operations, pagination and get-by-id cases. | F1 Discovery & Search, F5 Content Control, T3 Automated Testing | +| | `TicketServiceTest.java` | JUnit / Mockito | Verifies ticket creation, purchase logic and ticket-user-event relationships. | F3 Ticketing & History, T3 Automated Testing | +| **Integration (Repositories)** | `EventRepositoryTest.java` | JUnit / Spring Boot | Verifies event repository behavior and persistence operations. | F1 Discovery & Search, F5 Content Control, T5 Data Persistence, T3 Automated Testing | +| | `UserRepositoryTest.java` | JUnit / Spring Boot | Verifies user repository behavior and persistence operations. | F2 User Activity, T5 Data Persistence, T3 Automated Testing | +| | `ParticipantRepositoryTest.java` | JUnit / Spring Boot | Verifies participant repository behavior and persistence operations. | F1 Discovery & Search, F5 Content Control, T5 Data Persistence, T3 Automated Testing | +| | `TicketRepositoryTest.java` | JUnit / Spring Boot | Verifies ticket repository behavior and relationships with events and users. | F3 Ticketing & History, T5 Data Persistence, T3 Automated Testing | +| **API/System Tests (REST Assured)** | `EventApiTest.java` | REST Assured | Verifies event API operations: list, detail, filters, validation, role restrictions, image endpoints and creation flows. | F1 Discovery & Search, F5 Content Control, T1 Modern Technologies, T3 Automated Testing | +| | `UserApiTest.java` | REST Assured | Verifies user API operations: current user retrieval, profile updates, image endpoints and HTTP status codes. | F2 User Activity, T1 Modern Technologies, T3 Automated Testing | +| | `ParticipantApiTest.java` | REST Assured | Verifies participant API operations: list, detail, create, update, delete, image endpoints and error handling. | F1 Discovery & Search, F5 Content Control, T1 Modern Technologies, T3 Automated Testing | +| | `TicketApiTest.java` | REST Assured | Verifies ticket API operations: purchasing, ownership validation, retrieval and cancellation if available. | F3 Ticketing & History, T1 Modern Technologies, T3 Automated Testing | +| | `AuthApiTest.java` | REST Assured | Verifies authentication and security flows: login, refresh, logout, registration and invalid input cases. | F2 User Activity, T1 Modern Technologies, T3 Automated Testing | + +#### Frontend Tests + +| Test Level | Test Class | Technology | Description | Traceability | +| :--- | :--- | :--- | :--- | :--- | +| **Unit (Components)** | `app.component.spec.ts` | Vitest / TestBed | Verifies root component initialization. | T1 Modern Technologies, T3 Automated Testing | +| | `event-list.component.spec.ts` | Vitest / TestBed | Verifies rendering of main page. | F1 Discovery & Search, T3 Automated Testing | +| | `event-detail.component.spec.ts` | Vitest / TestBed | Verifies rendering of event details. | F1 Discovery & Search, T3 Automated Testing | +| | `all-events.component.spec.ts` | Vitest / TestBed | Verifies the full events page, including pagination behavior. | F1 Discovery & Search, T3 Automated Testing | +| | `participants-list.component.spec.ts` | Vitest / TestBed | Verifies the participants list page, including pagination behavior. | F1 Discovery & Search, T3 Automated Testing | +| | `participant-detail.component.spec.ts` | Vitest / TestBed | Verifies rendering of participant detail pages. | F1 Discovery & Search, T3 Automated Testing | +| | `login.component.spec.ts` | Vitest / TestBed | Verifies login form validation and authentication behavior. | F2 User Activity, T3 Automated Testing | +| | `register.component.spec.ts` | Vitest / TestBed | Verifies registration form validation and error handling. | F2 User Activity, T3 Automated Testing | +| | `user-page.component.spec.ts` | Vitest / TestBed | Verifies user profile page rendering, profile editing and purchased tickets display. | F2 User Activity, F3 Ticketing & History, T3 Automated Testing | +| | `ticket-selection.component.spec.ts` | Vitest / TestBed | Verifies ticket selection UI, quantity selection and price summary behavior. | F3 Ticketing & History, T3 Automated Testing | +| | `manage-events.component.spec.ts` | Vitest / TestBed | Verifies administrator event management behavior. | F5 Content Control, T3 Automated Testing | +| | `manage-participants.component.spec.ts` | Vitest / TestBed | Verifies administrator participant management behavior. | F5 Content Control, T3 Automated Testing | +| | `header.component.spec.ts` | Vitest / TestBed | Verifies navigation behavior and role-based menu rendering. | F1 Discovery & Search, F2 User Activity, F5 Content Control, T3 Automated Testing | +| | `error.component.spec.ts` | Vitest / TestBed | Verifies error display and global error handling UI. | T1 Modern Technologies, T3 Automated Testing | +| | `add-participants.component.spec.ts` | Vitest / TestBed | Verifies add/edit participant form behavior. | F5 Content Control, T3 Automated Testing | +| | `add-event.component.spec.ts` | Vitest / TestBed | Verifies add/edit event form validation. | F5 Content Control, T3 Automated Testing | +| **Integration (Services)** | `event.service.spec.ts` | HttpClient / TestBed | Verifies real HTTP interactions with the event API. | F1 Discovery & Search, F5 Content Control, T1 Modern Technologies, T3 Automated Testing | +| | `user.service.spec.ts` | HttpClient / TestBed | Verifies real HTTP interactions with user-related API endpoints. | F2 User Activity, T1 Modern Technologies, T3 Automated Testing | +| | `participant.service.spec.ts` | HttpClient / TestBed | Verifies real HTTP interactions with the participant API. | F1 Discovery & Search, F5 Content Control, T1 Modern Technologies, T3 Automated Testing | +| | `ticket.service.spec.ts` | HttpClient / TestBed | Verifies real HTTP interactions with ticket API endpoints. | F3 Ticketing & History, T1 Modern Technologies, T3 Automated Testing | +| | `auth.service.spec.ts` | HttpClient / TestBed | Verifies real HTTP interactions with authentication API endpoints. | F2 User Activity, T1 Modern Technologies, T3 Automated Testing | +| **System (E2E)** | `EventE2ETest.java` | Selenium | Verifies event browsing, event creation and event detail workflows. | F1 Discovery & Search, F5 Content Control, T3 Automated Testing | +| | `UserE2ETest.java` | Selenium | Verifies user flows such as login, profile management and user page behavior. | F2 User Activity, T3 Automated Testing | +| | `ParticipantE2ETest.java` | Selenium | Verifies participant browsing, participant detail and management workflows. | F1 Discovery & Search, F5 Content Control, T3 Automated Testing | +| | `TicketE2ETest.java` | Selenium | Verifies the complete ticket purchase flow. | F3 Ticketing & History, T3 Automated Testing | + +### Test Statistics + +> This section summarizes the results obtained from the execution of the automated tests implemented in the project, including the number of tests executed, coverage percentages and results. + +| Test Type | Total Tests | Passed | Failed | Coverage (%) | +| :--- | :---: | :---: | :---: | :---: | +| Unit (Server) | 64 | 64 | 0 | Included in backend total | +| Unit (Client) | 113 | 113 | 0 | 81.37% line coverage and 80.31% statement coverage | +| Integration (Server) | 40 | 40 | 0 | Included in backend total | +| Integration (Client) | 29 | 29 | 0 | 100% line coverage and 100% statement coverage | +| System (Server) | 103 | 103 | 0 | Included in backend total | +| System (Client) | 19 | 19 | 0 | N/A | +| Server Total | 207 | 207 | 0 | 91% instruction coverage / 58% branch coverage / 90.11% line coverage | +| Client Total | 161 | 161 | 0 | Unit coverage: 81.55% line / Integration coverage: 100% | + +#### Backend Test Execution & Code Coverage Report (JaCoCo) + +![Backend Tests](https://github.com/user-attachments/assets/9449c4c2-5d3c-4dcc-a4e7-8bd5c76e0bdb) + +![Backend Coverage](https://github.com/user-attachments/assets/7aa5c878-ddbf-4c90-9879-b20cc7fb9360) + +#### Frontend Test Execution & Code Coverage Report (Vitest) + +![Frontend Tests & Coverage](https://github.com/user-attachments/assets/9c0226dc-930e-40c0-833f-e97e56b10db0) + +### Static Code Analysis + +> The project uses SonarCloud to perform static code analysis, identifying code smells, bugs and security vulnerabilities. The following table summarizes the main metrics obtained from the analysis, including number of classes, lines of code, etc. + +| Metric | Count | Rating | +| :--- | :---: | :---: | +| Lines of Code | 3.3k | - | +| Reliability | 3 | B | +| Security | 1 | E | +| Maintainability | 12 | A | +| Security Hotspots | 1 | - | +| Duplicated Lines (%) | 0.0% | - | + +![SonarCloud Analysis](https://github.com/user-attachments/assets/f57bbe34-4abf-45fc-bab7-31c10b3a46c2) + +## Docker Deployment + +> GoEventsNow is packaged and deployed using Docker, which allows the application to be executed in any environment with Docker installed. The deployment is based on a single Docker image for the web application and a Docker Compose file to coordinate the application container with the MySQL database container. + +### Packaging & Publishing + +> The application is packaged as a Docker image and published in DockerHub. Kubernetes and serverless deployment are not used in this version. The image includes both the backend and the frontend, so both parts of the application run together in the same container. This is made by using a multi-stage Dockerfile: + +1. The Angular frontend is built. +2. The generated frontend files are copied into the Spring Boot static resources. +3. The Spring Boot backend is packaged. +4. The final container runs the generated application as `app.jar`. + +### Docker Compose + +> The compose files defined two services: + +- `goeventsnow-app`: This service runs the Docker image containing the backend and frontend of the application. +- `goeventsnow-db`: This service runs the MySQL database container, which is required for the application to work. + +> Two different docker-compose files for different purposes: + +- `docker-compose.yml`: Used for final stable application version. In this case this will execute the `albertoml1999/goeventsnow-app:0.1.0` image, which is the stable version of the application published in DockerHub. +- `docker-compose-dev.yml`: Used for development and testing. This will execute the `albertoml1999/goeventsnow-app:dev` image, which is the development version of the application published in DockerHub. + +> The stable version can be executed using the following command: + +```bash +docker-compose -f docker-compose.yml up +``` + +> The development version can be executed using the following command: + +```bash +docker-compose -f docker-compose-dev.yml up +``` + +> The application is exposed through HTTPS by mapping the host port 443 to the application port 8443 inside the container: + +```text +https://localhost +``` + +### DockerHub Artifacts + +> The application Docker image is published in DockerHub: + +```text +https://hub.docker.com/r/albertoml1999/goeventsnow-app +``` + +> The Docker Compose file is also published in DockerHub as an OCI artifact: + +```text +https://hub.docker.com/r/albertoml1999/goeventsnow-app-compose +``` + +> The stable release is published using the following tags: + +```text +albertoml1999/goeventsnow-app:0.1.0 +albertoml1999/goeventsnow-app:latest +albertoml1999/goeventsnow-app-compose:0.1.0 +albertoml1999/goeventsnow-app-compose:latest +``` + +> The development version is published with the dev tag: + +```text +albertoml1999/goeventsnow-app:dev +albertoml1999/goeventsnow-app-compose:dev +``` + +## Development Process + +> The project follows an iterative and incremental process based on Agile principles, incorporating Extreme Programming (XP) practices like CI/CD and Kanban (GitHub Project) for workflow management. + +### Task Management + +> Managed through GitHub Projects (Kanban board) to organize and prioritize the GitHub Issues created for the development of new features, bug fixes and improvements. + +### Git Strategy + +> The project uses GitHub as the version control platform, implementing GitFlow as the branching strategy to manage the development process effectively. There are several types of branches used to organize the work: + +- main: Stable production code. +- develop: Integration branch to develop new features or to fix errors. +- feature/**: Branch to add and develop new functionalities. +- fix/**: Branch to update and correct previous functionalities already created. + +### Git Metrics + +- Number of Commits: 248 commits made. +- Number of Branches: Not more than 4 at the same time (Main, Develop, Feature/** or Fix/** ). +- Number of Pull Requests: 61 Pull Requests made. + +### Continuous Integration (CI) + +> The CI workflows are implemented using GitHub Actions to automate the building, testing and quality control of the project, ensuring that both frontend and backend code is correct before merging into the main branch. There are 2 different types of workflows made, depending on the kind of tests they analyze and when its applied. + +#### Workflow: CI - Basic (Basic Quality Control) + +> Runs on every commit made in a feature/fix branch to ensure that changes do not break the application and its tests. + +- Job: + - Backend (Server) + Frontend (Client) + Sonar (Static Code Analysis): + - Objective: Compile backend, build frontend, generate code coverage, static code analysis and run unit tests. + - Steps: + 1. Set up the MySQL database. + 2. Checkout repository. + 3. Set up JDK 21 (Temurin distribution). + 4. Compile backend and run unit tests (`EventServiceTest,ParticipantServiceTest,TicketServiceTest,UserServiceTest`) using Maven. + 5. Set up Node.js 20 with npm. + 6. Install all dependencies. + 7. Build Angular project in production mode. + 8. Run frontend unit tests (`**/*.component.spec.ts`) with code coverage. + 9. Execute sonar-scanner for static code analysis. + +#### Workflow: CI - Complete (Complete Quality Control) + +> Runs on Pull Request made on a feature branch, with base in the main branch. + +- Job: + - Objective: Run unit, integration and system tests for both backend and frontend, and static code analysis. + - Steps: + 1. Set up MySQL database. + 2. Checkout repository. + 3. Install wait tools. + 4. Set up JDK 21 and Node.js 20. + 5. Install all frontend dependencies. + 6. Compile backend and run Unit (`EventServiceTest`, `ParticipantServiceTest`, `TicketServiceTest`, `UserServiceTest`), Integration (`EventRepositoryTest`, `ParticipantRepositoryTest`, `TicketRepositoryTest`, `UserRepositoryTest`) & System tests (`AuthApiTest`, `EventApiTest`, `ParticipantApiTest`, `TicketApiTest`, `UserApiTest`). + 7. Build Angular project in production mode. + 8. Start backend and wait for port 8443. + 9. Run frontend Unit (`**/*.component.spec.ts`) & Integration tests ( `**/*.service.spec.ts`) with code coverage. + 10. Start frontend and wait for port 4200. + 11. Run frontend System tests (`EventE2ETest,ParticipantE2ETest,TicketE2ETest,UserE2ETest`). + 12. Execute sonar-scanner for static code analysis. + +### Continuous Deployment (CD) + +> The project uses GitHub Actions to automate the deployment process, ensuring that the application is packaged and published in DockerHub. There are three different workflows for deployment, depending on the trigger: + +#### Workflow: CD - Dev to Main + +> Runs when changes are pushed to the main branch. + +- Job: `publish-dev` + - Objective: Build and publish the application Docker image with the `dev` tag to DockerHub. + - Trigger: Push events on the main branch. + - Steps: + 1. Call the `reusable-build-publish` workflow with the `dev` tag as input to build and publish the development version of the application. + +#### Workflow: CD - Release + +> Runs when a release is published in the GitHub repository. + +- Job: `publish-release` + - Objective: Build and publish the application Docker image with the release tag and latest tag to DockerHub. + - Trigger: Release published event. + - Steps: + 1. Call the `reusable-build-publish` workflow with the release tag and `latest` as input to build and publish the stable version of the application. + +#### Workflow: CD - Manual Trigger Dispatch + +> Runs when manually triggered through GitHub Actions workflow dispatch. + +- Job: `calculate-tag` & `publish-manual` + - Objective: Build and publish the application Docker image with a custom tag based on the branch, date and commit. + - Trigger: Manual workflow dispatch with optional input. + - Steps: + 1. Calculate a custom tag using the current branch name, date and commit hash. + 2. Call the `reusable-build-publish` workflow with the calculated custom tag as input to build and publish the application. + +#### Workflow: Reusable Build and Publish Workflow + +> Reusable workflow called by the CD workflows to avoid duplicating the Docker build and publishing logic. + +- Job: `build-and-push` + - Objective: Build and publish the application Docker image and publish the Docker Compose file as an OCI artifact in DockerHub. + - Trigger: It is called with `workflow_call`, so it is not executed directly. It is called by other workflows such as `CD - Dev to Main`, `CD - Release` and `CD - Manual Trigger Dispatch`. + - Inputs: + - `image_tag`: Tag used to publish the Docker image. + - `push_latest`: Indicates if the `latest` tag must also be published. + - `compose_tag`: Optional tag for the Docker Compose OCI artifact. If empty, it uses the same value as `image_tag`. + - `compose_path`: Path to the Docker Compose file to publish. + - `dockerfile`: Path to the Dockerfile used to build the application image. + - `build_context`: Docker build context. + - Steps: + 1. Checkout the repository. + 2. Set up Docker Buildx to build the Docker image. + 3. Log in to DockerHub using the repository secrets. + 4. Build and push the application Docker image using the received `image_tag`. + 5. If `push_latest` is enabled, also publish the Docker image with the `latest` tag. + 6. Install ORAS to publish OCI artifacts. + 7. Log in to DockerHub using ORAS. + 8. Check that the Docker Compose file exists. + 9. Publish the Docker Compose file as an OCI artifact in DockerHub using the selected tag. + 10. If `push_latest` is enabled, also publish the Docker Compose OCI artifact with the `latest` tag. + - Published artifacts: + - Docker image: + - `albertoml1999/goeventsnow-app:` + - `albertoml1999/goeventsnow-app:latest` when `push_latest` is enabled. + - Docker Compose OCI artifact: + - `albertoml1999/goeventsnow-app-compose:` + - `albertoml1999/goeventsnow-app-compose:latest` when `push_latest` is enabled. + +### Release + +> The project uses GitHub releases to package stable versions of the application. + +The release process follows these steps: + +1. Ensure that all tests are passing and the code is stable. +2. Update the project versions before creating the release: + - Update the `version` field in the `pom.xml` file of the backend to match the new release version (e.g., `0.1.0`). + - Update the `version` field in the `package.json` file of the frontend to match the new release version (e.g., `0.1.0`). + - Update the `image` field in the `docker-compose.yml` file to use the new release version of the Docker image (e.g., `albertoml1999/goeventsnow-app:0.1.0`). +3. Create a new release in GitHub, providing the corresponding version number and a description of the changes included in the release. +4. The release will trigger the `CD - Release` workflow, which will build and publish the application Docker image and the Docker Compose OCI artifact with the release tag and latest tag to DockerHub. +5. After the release, the `main` branch is updated with the next development version (e.g., `0.2.0-SNAPSHOT`). + +### Published Versions + +| Version | Release Date | Type | High-level Description | +| :--- | :---: | :--- | :--- | +| `v0.0.1` | 10/02/2026 | Stable release | First stable release, which establishes the project architecture and quality standards. It includes Spring Boot backend, Angular frontend and MySQL database structure, together with CI workflows, SonarCloud analysis, automated testing and coverage reporting.| +| `0.0.1` | 13/05/2026 | Test release | First test release of the MVP version, used to verify that the release CD workflow published the Docker image and Docker Compose OCI artifact correctly.| +| `0.0.2` | 13/05/2026 | Test release | Second test release of the MVP version, used to verify the release CD workflow after fixing the Dockerfile and the deployment issue caused by the versioned `.jar` file name. | +| `0.1.0` | 15/05/2026 | Stable release | MVP release with user authentication, event and participant browsing, ticket purchasing, user profile management, administrator event/participant management and image management. It also adds Docker deployment, Docker Compose with MySQL, OCI compose artifacts and GitHub Actions workflows for development, manual and release builds. | + +You can find the list of releases here: +[GoEventsNow Releases](https://github.com/codeurjc-students/2025-GoEventsNow/releases) + + +## Code Edit & Execution + +> This section provides instructions to clone the repository, execute the application locally or with Docker, interact with the API, the tools used during development, and how to run the tests implemented. + +### Cloning the Repository + +> To clone the project repository, ensure you have Git installed. Then use the following command in your terminal or command prompt: + +```bash +git clone https://github.com/codeurjc-students/2025-GoEventsNow +``` + +### Execution + +> The application can be executed in two different ways: + +1. **Local Execution**: Run the backend and frontend locally on your machine. +2. **Docker Execution**: Run the application using Docker and Docker Compose, which includes both the backend and frontend in a single container, and a separate container for the MySQL database. + +#### Local Execution + +> The application requires a MySQL server installed and running on your local machine. You can use the following credentials to connect to the database or start one using Docker: + +```bash +docker run --name goeventsnow-db -e MYSQL_ROOT_PASSWORD=password -e MYSQL_DATABASE=goeventsnow_db -p 3306:3306 -d mysql:8 +``` + +- Database Name: `goeventsnow_db` +- Username/Password: Ensure they match the configuration in the `application.properties` file of the backend. In the default configuration, it uses `root` as username and `password` as password. + +> You can execute the backend and start the Spring Boot application: + +```bash +cd backend +mvn spring-boot:run +``` +The backend will start with HTTPS on port 8443. + +```text +https://localhost:8443 +``` + +The REST API will be available at: + +```text +https://localhost:8443/api/v1 +``` + +> In a separate terminal, launch the frontend Angular application: + +```bash +cd frontend +npm install ## Only the first time used +npm start +``` +The frontend will start on port 4200. + +#### Docker Execution + +> To run the application using Docker, ensure you have Docker installed and running on your machine. + +GoEventsNow is published in DockerHub as a Docker image and can be executed with Docker Compose. The project includes two Docker Compose files: + +- `docker-compose.yml`: runs the stable version of the application. +- `docker-compose-dev.yml`: runs the development version of the application. + +##### Run from DockerHub Image + +> Stable version: + +```bash +docker-compose -f docker-compose.yml up -d +``` + +> Development version: + +```bash +docker-compose -f docker-compose-dev.yml up -d +``` + +> To stop the stable version: + +```bash +docker-compose -f docker-compose.yml down +``` + +> To stop the development version: + +```bash +docker-compose -f docker-compose-dev.yml down +``` + +##### Run from the DockerHub Compose OCI Artifact + +> The Docker Compose file is also published in DockerHub as an OCI artifact, which can be pulled and executed using Docker Compose. To do this, you need to have ORAS installed to pull the OCI artifact and then execute it with Docker Compose. If you don't have ORAS installed, you can follow the instructions in the official documentation: [ORAS - OCI Artifacts](https://oras.land/docs/). Once you have ORAS installed, you need to create an empty folder and pull the Docker Compose artifact using the following command: + +```bash +oras pull docker.io/albertoml1999/goeventsnow-app-compose:0.1.0 +``` + +> The compose file will be downloaded in the folder previously created, and you can start the application with the following command: + +```bash +docker-compose -f docker-compose.yml up -d +``` + +> To stop the application: + +```bash +docker-compose -f docker-compose.yml down +``` + +##### Access URLs + +> For Docker, the application will be available at: + +```text +https://localhost +``` + +> The REST API will be available at: + +```text +https://localhost/api/v1 +``` + +> If the browser shows a certificate warning, it can be accepted because the application uses a self-signed certificate for local HTTPS execution. + +### Accessing the Application + +> Once both backend and frontend are running locally, you can access the application through your web browser: + +Access the application at: http://localhost:4200/. + +> If you are running the application with Docker, you can access the application through your web browser: + +Access the application at: https://localhost/. + +### CI Workflows + +> The CI workflows are defined in the `.github/workflows/` directory of the repository. It contains two main workflows files and they can only be run depending on the trigger. + +- `basic-quality.yml`: This workflow runs on every commit to a feature/fix branch, performing basic quality control by compiling the backend, building the frontend, running unit tests, and performing static code analysis with SonarCloud. +- `complete-quality.yml`: This workflow runs on pull requests to the main branch, executing a complete quality control process that includes unit, integration, and system tests for both backend and frontend, including code analysis with SonarCloud. + +### CD Workflows + +> The CD workflows are defined in the `.github/workflows/` directory of the repository. It contains three main workflow files for deployment, depending on the trigger. + +- `cd-dev.yml`: This workflow runs when changes are pushed to the main branch, building and publishing the development version of the application Docker image and Docker Compose OCI artifact to DockerHub. +- `cd-release.yml`: This workflow runs when a release is published in the GitHub repository, building and publishing the stable version of the application Docker image and Docker Compose OCI artifact to DockerHub. +- `cd-manual-dispatch.yml`: This workflow can be manually triggered through GitHub Actions workflow dispatch, allowing to build and publish a custom version of the application Docker image and Docker Compose OCI artifact to DockerHub based on the branch, date and commit. + +> The reusable workflow `reusable-build-publish.yml` is called by the CD workflows to perform the actual building and publishing of the Docker images and Docker Compose OCI artifacts, avoiding duplication of code in the CD workflows. + +### Used Tools + +> This section describes the main tools used during development, testing, deployment and interaction with the application. + +- **Visual Studio Code**: Main IDE used for both backend and frontend development. It provides a unified environment for editing, debugging and testing the application. Extensions for Java, Angular, Docker, Git and SonarQube for IDE were used to improve the development workflow. + +- **Postman**: Used to manually test and interact with the REST API. It allows sending HTTP requests, checking JSON responses, testing authentication endpoints and validating protected operations. + +- **Web Browser**: Used to access and test the web application from the user interface. It was also used to validate SPA routing, authentication flows and HTTPS access both in local development and Docker execution. + +- **GitHub**: Platform used to host the repository, version control, manage pull requests and commits, create releases and store the project source code. + +- **GitHub Actions**: Used to CI/CD workflows, including backend/frontend tests, static code analysis and Docker image publication. + +- **Docker/DockerHub**: Used as the registry where the application Docker image and the Docker Compose OCI artifact are published. + +- **ORAS**: Used to publish and pull the Docker Compose file as an OCI artifact from DockerHub. + +- **SonarCloud**: Used to perform static code analysis and monitor code quality, maintainability, bugs, vulnerabilities and duplicated code. + +- **MySQL**: Used to manage the MySQL database during development. + +### API Interaction (Postman) + +> Postman is used to test and interact with the REST API provided by the backend. This allows to verify the endpoints, check JSON responses and simulate requests. + +**How to use Postman:** +1. Download and install Postman from [https://www.postman.com/](https://www.postman.com/). +2. Open Postman and create a new request. +3. Set the request method (GET, POST, etc.) and the URL (e.g., `https://localhost:8443/api/v1/events/`) locally or (e.g., `https://localhost/api/v1/events/`) in Docker. +4. Add any necessary headers or body data for the request. +5. Send the request and review the response from the server. + +**Collection File:** +- You can find the Postman collection file generated here: [GoEventsNow Postman Collection](GoEventsNow_Collection.postman_collection.json). + +### Test Execution + +> This section describes the steps to execute the automated tests implemented in the project for both backend and frontend. + +#### Backend Tests + +> To run all the backend tests, ensure you have Maven installed. Then execute the following commands to execute the different types of tests: + +##### Unit tests + +```bash +cd backend +mvn -Dtest="EventServiceTest,ParticipantServiceTest,TicketServiceTest,UserServiceTest" test +``` + +##### Integration tests + +```bash +cd backend +mvn -Dtest="EventRepositoryTest,ParticipantRepositoryTest,TicketRepositoryTest,UserRepositoryTest" test +``` + +##### System tests + +```bash +cd backend +mvn -Dtest="AuthApiTest,EventApiTest,ParticipantApiTest,TicketApiTest,UserApiTest" test +``` + +This command will run the unit, integration and system tests defined in the backend. + +> To run a specific test, use the following command, replacing `TEST_CLASS_NAME` with the name of the test class you want to execute: + +```bash +cd backend +mvn test -Dtest="${TEST_CLASS_NAME}" +``` + +#### Frontend Tests + +> To run the frontend tests, ensure you have Node.js and npm installed. Then execute the following commands to run the different types of tests: + +##### Unit Tests + +```bash +cd frontend +ng test --include="**/*.component.spec.ts" --watch=false --coverage +``` + +##### Integration Tests + +> To run the integration test, the backend application must be running. Then execute the following command to run the integration tests with code coverage: + +```bash +cd frontend +npm run test:integration +``` +This command will run the unit and the integration tests defined in the frontend, with code coverage. You can view the coverage report by opening: `frontend/coverage/index.html` in your web browser. + +##### System Tests + +> To run the system tests, ensure the backend application and the frontend application are running. Then execute the following command: + +```bash +cd backend +mvn -Dtest="EventE2ETest,ParticipantE2ETest,TicketE2ETest,UserE2ETest" test +``` + From 566c266578b7a97e950c1952175e3cd4737e8a78 Mon Sep 17 00:00:00 2001 From: AlbertoML1999 <146851709+AlbertoML1999@users.noreply.github.com> Date: Sat, 16 May 2026 12:21:55 +0200 Subject: [PATCH 3/5] Revise README with new screenshots and video link Updated screenshots section and demo video link in README. --- README.md | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 47cc6e1..61b920e 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,5 @@ + + # 🎟️ 2025-GoEventsNow ![GoEventsNow Logo](https://github.com/user-attachments/assets/1cbd97f1-e514-47d9-894d-658650db2900) @@ -21,15 +23,17 @@ GoEventsNow aims to provide a complete, modern and user-centered system that sim > In addition, this version includes Docker deployment and continuous delivery support. The application is packaged as a single Docker image containing both the Spring Boot backend and the Angular frontend, coordinated with a MySQL database through Docker Compose. The image and the Docker Compose artifact are published in DockerHub, and GitHub Actions workflows automate development builds, manual builds and release publication. --- -## 🖥️ *Screen Mockups* +## 🖥️ *Screenshots* > This section provides some key screens, which define the structure and the application functionalities. > -> ![Main Page](https://github.com/user-attachments/assets/2710564e-f00a-428f-b535-9f911e2aba1f) +> ![Main Page](https://github.com/user-attachments/assets/78ad924a-3ec4-4d8f-970f-4edde75f012f) --- > -> ![Search Event](https://github.com/user-attachments/assets/1eee1d72-e94c-4c77-a741-210e669cf4db) - +> ![Search Event](https://github.com/user-attachments/assets/22b17a16-4291-4b47-a4dc-c00fa48a531e) +--- +> +> ![Manage Participants](https://github.com/user-attachments/assets/00d949a4-da1b-437f-b6df-e8ec470fb628) --- > [!WARNING] @@ -42,7 +46,7 @@ GoEventsNow aims to provide a complete, modern and user-centered system that sim > In the following video, you can see a demonstration of the current functionalities implemented in the 0.1.0 version of GoEventsNow. The video shows the main features of the application, including event browsing, participant browsing, event and participant details, user registration and login, ticket purchase, user profile management, and administrator functionalities for managing events and participants. The video separates the different user roles, showing the experience of an anonymous user, a registered user and an administrator user. -[Watch the demo of GoEventsNow for version 0.1.0](VIDEO_URL) +[Watch the demo of GoEventsNow for version 0.1.0](https://youtu.be/URnujjfUix4) --- From ae7bd36b4e8174c09ec2d01df410c5504786ec75 Mon Sep 17 00:00:00 2001 From: AlbertoML1999 <146851709+AlbertoML1999@users.noreply.github.com> Date: Sat, 16 May 2026 12:42:04 +0200 Subject: [PATCH 4/5] Update images and descriptions in functionalities.md --- docs/functionalities.md | 50 +++++++++++++++++++++++++---------------- 1 file changed, 31 insertions(+), 19 deletions(-) diff --git a/docs/functionalities.md b/docs/functionalities.md index af1c477..d823cab 100644 --- a/docs/functionalities.md +++ b/docs/functionalities.md @@ -5,31 +5,31 @@ #### Main page -![Main page]() +![Main page](https://github.com/user-attachments/assets/ba92f335-e9b1-419d-a352-cbb0be865384) Anonymous users can access the main page of the application, which provides an overview of the trending events and participants, as well as a search bar and navigation header to explore the content. #### Event Listing -![Event list]() +![Event list](https://github.com/user-attachments/assets/086b6f8f-4d99-4fee-ab9c-0cb2f21248ab) Anonymous users can view and explore all available events. #### Participant Listing -![Participant list]() +![Participant list](https://github.com/user-attachments/assets/4b93cf4f-62a3-40cb-8968-a48fda5c624a) Anonymous users can view and explore all available participants. #### Event details -![Event detail]() +![Event detail](https://github.com/user-attachments/assets/4a8848b3-0eab-487b-bb89-b7957eae4a56) Anonymous users can view detailed information about specific events, including title, description, category, date, location, time, prices, available tickets, image and associated participants. #### Participant details -![Participant detail]() +![Participant detail](https://github.com/user-attachments/assets/2c405920-d9f1-4641-873c-9459cbdfdfe7) Anonymous users can view detailed information about participants, including name, type, biography, image and the events they are associated with. @@ -41,37 +41,37 @@ Anonymous users can view detailed information about participants, including name #### Register -![Register page]() +![Register page](https://github.com/user-attachments/assets/c7452628-cdf8-4867-a536-def59b6f54f3) Anonymous users can register to create a new account. #### Log In -![Login page]() +![Login page](https://github.com/user-attachments/assets/769ef7b7-2769-4c01-b479-fa233caecc67) Anonymous users can log in to access additional functionalities by providing their email and password. #### Log Out -![Logout]() +![Logout](https://github.com/user-attachments/assets/2ec11c62-127b-47c5-a9a9-e2d99d170aee) Registered users can log out of their account. #### User profile (Edit profile) -![User profile]() +![User profile](https://github.com/user-attachments/assets/2ec11c62-127b-47c5-a9a9-e2d99d170aee) Registered users can view and edit their personal information, including fullname, email and phone number. #### User profile (Purchased tickets) -![Purchased tickets]() +![Purchased tickets](https://github.com/user-attachments/assets/280c2040-34fb-4a0b-a7d5-97d9fb75630e) Registered users can view their purchased tickets from the user profile page, including event details, price and ticket type. #### Ticket purchase -![Ticket purchase]() +![Ticket purchase](https://github.com/user-attachments/assets/d7d935ab-0ee4-4fb5-8985-af905945ea60) Registered users can purchase event tickets by selecting the number of tickets and the ticket type (BASIC OR VIP). @@ -83,25 +83,37 @@ Registered users can purchase event tickets by selecting the number of tickets a #### Event management -![Event management]() +![Event management](https://github.com/user-attachments/assets/5c1024aa-b8aa-4bfc-9c5a-558813e885c7) Administrators can create, edit and delete events. #### Participant management -![Participant management]() +![Participant management](https://github.com/user-attachments/assets/f70f427d-a639-46cd-a021-65aca687e606) Administrators can create, edit and delete participants. -#### Event Creation/Edition Form +#### Event Creation Form -![Event creation/edition form]() +![Event creation form](https://github.com/user-attachments/assets/691978d1-4832-4cbb-9e06-259662adbd75) -Administrators can use this form to create new events or edit existing ones. +Administrators can use this form to create new events. -#### Participant Creation/Edition Form +#### Event Edition Form -![Participant creation/edition form]() +![Event edition form](https://github.com/user-attachments/assets/725d0cca-cc7f-4429-a745-48b0e8b406fa) -Administrators can use this form to create new participants or edit existing ones. +Administrators can use this form to edit existing events. + +#### Participant Creation Form + +![Participant creation form](https://github.com/user-attachments/assets/1c12e88c-12e8-4371-a696-60eb3f25ba3f) + +Administrators can use this form to create new participants. + +#### Participant Edition Form + +![Participant edition form](https://github.com/user-attachments/assets/f2addbaf-f0d7-45b7-ba94-47938e0a1df5) + +Administrators can use this form to edit existing participants. From 66a3135abda86eb7faa8410ac8f01bbe29b4c20d Mon Sep 17 00:00:00 2001 From: AlbertoML1999 <146851709+AlbertoML1999@users.noreply.github.com> Date: Sat, 16 May 2026 13:00:36 +0200 Subject: [PATCH 5/5] Update development guide with diagrams and links --- docs/development_guide.md | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/docs/development_guide.md b/docs/development_guide.md index 2af3bae..771d962 100644 --- a/docs/development_guide.md +++ b/docs/development_guide.md @@ -122,7 +122,7 @@ The application is deployed locally as several independent processes: > The domain model of the application is based on the main entities, such as User, Event, Participant and Ticket, and their relationships. The User entity represents the users of the application, the Event entity represents the events available in the platform, the Participant entity represents the participants of the events, and the Ticket entity represents the tickets purchased by users for specific events. -[NEED TO INSERT DOMAIN MODEL DIAGRAM] +![Domain Model](https://github.com/user-attachments/assets/5f3ee8d5-04ee-476e-b60a-50090f0ad0d5) ### REST API @@ -216,7 +216,7 @@ The application is deployed locally as several independent processes: 4. **Model Layer**: It contains the entities that represent the application's domain objects. 5. **Security Layer**: It manages the security configuration, including JWT authentication and role-based access control. -[NEED TO INSERT BACKEND ARCHITECTURE DIAGRAM] +![Server Architecture](https://github.com/user-attachments/assets/57393a60-652b-4af7-91ee-d6bf7fe07346) ### Client Architecture @@ -225,7 +225,7 @@ The application is deployed locally as several independent processes: 1. **Components**: They are responsible for the presentation of the application and the features related to user interaction. They manage the views and templates, and they call the services to obtain data from the backend and render it in the UI. 2. **Services**: They manage the communication with the backend REST API. -[NEED TO INSERT FRONTEND ARCHITECTURE DIAGRAM] +![Client Architecture](https://github.com/user-attachments/assets/e8c44610-d309-4d87-8c10-27250b492570) ## Quality Control @@ -300,13 +300,15 @@ The application is deployed locally as several independent processes: #### Backend Test Execution & Code Coverage Report (JaCoCo) -![Backend Tests](https://github.com/user-attachments/assets/9449c4c2-5d3c-4dcc-a4e7-8bd5c76e0bdb) +![Backend Tests](https://github.com/user-attachments/assets/684c533a-2711-4ae6-8186-be35dd4072a7) -![Backend Coverage](https://github.com/user-attachments/assets/7aa5c878-ddbf-4c90-9879-b20cc7fb9360) +![Backend Coverage](https://github.com/user-attachments/assets/c05ccd5d-dd0e-4079-b399-ef44a9455d93) #### Frontend Test Execution & Code Coverage Report (Vitest) -![Frontend Tests & Coverage](https://github.com/user-attachments/assets/9c0226dc-930e-40c0-833f-e97e56b10db0) +![Frontend Tests](https://github.com/user-attachments/assets/72953ad3-0451-435a-8a1d-62e527dff354) + +![Frontend Coverage](https://github.com/user-attachments/assets/9b42832a-80be-48ff-8f04-60ff25a80330) ### Static Code Analysis @@ -551,7 +553,7 @@ The release process follows these steps: | `v0.0.1` | 10/02/2026 | Stable release | First stable release, which establishes the project architecture and quality standards. It includes Spring Boot backend, Angular frontend and MySQL database structure, together with CI workflows, SonarCloud analysis, automated testing and coverage reporting.| | `0.0.1` | 13/05/2026 | Test release | First test release of the MVP version, used to verify that the release CD workflow published the Docker image and Docker Compose OCI artifact correctly.| | `0.0.2` | 13/05/2026 | Test release | Second test release of the MVP version, used to verify the release CD workflow after fixing the Dockerfile and the deployment issue caused by the versioned `.jar` file name. | -| `0.1.0` | 15/05/2026 | Stable release | MVP release with user authentication, event and participant browsing, ticket purchasing, user profile management, administrator event/participant management and image management. It also adds Docker deployment, Docker Compose with MySQL, OCI compose artifacts and GitHub Actions workflows for development, manual and release builds. | +| `0.1.0` | 16/05/2026 | Stable release | MVP release with user authentication, event and participant browsing, ticket purchasing, user profile management, administrator event/participant management and image management. It also adds Docker deployment, Docker Compose with MySQL, OCI compose artifacts and GitHub Actions workflows for development, manual and release builds. | You can find the list of releases here: [GoEventsNow Releases](https://github.com/codeurjc-students/2025-GoEventsNow/releases)