From 65130f6670f36870935959d1b9f0fbab29e9a8a0 Mon Sep 17 00:00:00 2001 From: Modjak Date: Sun, 24 Nov 2024 22:56:32 +0300 Subject: [PATCH 1/8] search endpoint add --- backend/demo-group7/.gitignore | 2 + .../demo/controllers/SearchController.java | 53 ++++++++ .../java/com/group7/demo/models/Post.java | 2 +- .../group7/demo/models/TrainingProgram.java | 3 +- .../demo/repository/ExerciseRepository.java | 13 ++ .../demo/repository/PostRepository.java | 9 ++ .../repository/TrainingProgramRepository.java | 7 + .../group7/demo/services/SearchService.java | 124 ++++++++++++++++++ .../src/main/resources/application.properties | 9 +- 9 files changed, 216 insertions(+), 6 deletions(-) create mode 100644 backend/demo-group7/src/main/java/com/group7/demo/controllers/SearchController.java create mode 100644 backend/demo-group7/src/main/java/com/group7/demo/services/SearchService.java diff --git a/backend/demo-group7/.gitignore b/backend/demo-group7/.gitignore index 549e00a..f90e5dd 100644 --- a/backend/demo-group7/.gitignore +++ b/backend/demo-group7/.gitignore @@ -1,4 +1,5 @@ HELP.md +application.properties target/ !.mvn/wrapper/maven-wrapper.jar !**/src/main/**/target/ @@ -13,6 +14,7 @@ target/ .springBeans .sts4-cache + ### IntelliJ IDEA ### .idea *.iws diff --git a/backend/demo-group7/src/main/java/com/group7/demo/controllers/SearchController.java b/backend/demo-group7/src/main/java/com/group7/demo/controllers/SearchController.java new file mode 100644 index 0000000..0649e05 --- /dev/null +++ b/backend/demo-group7/src/main/java/com/group7/demo/controllers/SearchController.java @@ -0,0 +1,53 @@ +package com.group7.demo.controllers; + +import com.group7.demo.services.SearchService; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +@RestController +@RequestMapping("/api") +public class SearchController { + + private final SearchService searchService; + + public SearchController(SearchService searchService) { + this.searchService = searchService; + } + + +// @GetMapping("/search") +// public ResponseEntity> search(@RequestParam("q") String query) { +// // Split the query into keywords by whitespace and filter out any empty strings +// String[] keywords = query.split("\\s+"); +// List keywordList = Arrays.stream(keywords) +// .map(String::trim) +// .filter(k -> !k.isEmpty()) +// .toList(); +// +// // Pass the keyword list to the service +// Map results = searchService.search(keywordList); +// +// return ResponseEntity.ok(results); +// } + @GetMapping("/search") + public ResponseEntity> search(@RequestParam("q") String query) { +// String[] keywords = query.split("\\s+"); +// List keywordList = Arrays.stream(keywords) +// .map(String::trim) +// .filter(k -> !k.isEmpty()) +// .toList(); + + Map results = searchService.search(query); + + return ResponseEntity.ok(results); + } + + +} \ No newline at end of file diff --git a/backend/demo-group7/src/main/java/com/group7/demo/models/Post.java b/backend/demo-group7/src/main/java/com/group7/demo/models/Post.java index 60386cd..559c45e 100644 --- a/backend/demo-group7/src/main/java/com/group7/demo/models/Post.java +++ b/backend/demo-group7/src/main/java/com/group7/demo/models/Post.java @@ -19,7 +19,7 @@ public class Post { @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; - @Lob +// @Lob @Column(columnDefinition = "TEXT") private String content; diff --git a/backend/demo-group7/src/main/java/com/group7/demo/models/TrainingProgram.java b/backend/demo-group7/src/main/java/com/group7/demo/models/TrainingProgram.java index 0c2ae1e..9c7e461 100644 --- a/backend/demo-group7/src/main/java/com/group7/demo/models/TrainingProgram.java +++ b/backend/demo-group7/src/main/java/com/group7/demo/models/TrainingProgram.java @@ -22,7 +22,8 @@ public class TrainingProgram { private String title; - @Lob +// @Lob + @Column(columnDefinition = "TEXT") private String description; @ManyToOne diff --git a/backend/demo-group7/src/main/java/com/group7/demo/repository/ExerciseRepository.java b/backend/demo-group7/src/main/java/com/group7/demo/repository/ExerciseRepository.java index fe69c3d..52f74df 100644 --- a/backend/demo-group7/src/main/java/com/group7/demo/repository/ExerciseRepository.java +++ b/backend/demo-group7/src/main/java/com/group7/demo/repository/ExerciseRepository.java @@ -2,10 +2,23 @@ import com.group7.demo.models.Exercise; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; +import java.util.List; import java.util.Optional; public interface ExerciseRepository extends JpaRepository { Optional findByName(String name); + @Query("SELECT DISTINCT e FROM Exercise e " + + "LEFT JOIN e.instructions i " + + "WHERE " + + "LOWER(e.name) LIKE LOWER(CONCAT('%', :query, '%')) OR " + + "LOWER(e.bodyPart) LIKE LOWER(CONCAT('%', :query, '%')) OR " + + "LOWER(e.targetMuscle) LIKE LOWER(CONCAT('%', :query, '%')) OR " + + "LOWER(e.equipment) LIKE LOWER(CONCAT('%', :query, '%')) OR " + + "LOWER(i) LIKE LOWER(CONCAT('%', :query, '%'))") + List search(@Param("query") String query); + } diff --git a/backend/demo-group7/src/main/java/com/group7/demo/repository/PostRepository.java b/backend/demo-group7/src/main/java/com/group7/demo/repository/PostRepository.java index 385dc15..83e5d25 100644 --- a/backend/demo-group7/src/main/java/com/group7/demo/repository/PostRepository.java +++ b/backend/demo-group7/src/main/java/com/group7/demo/repository/PostRepository.java @@ -15,5 +15,14 @@ public interface PostRepository extends JpaRepository { @Query("SELECT DISTINCT p FROM Post p JOIN p.tags t WHERE t.name IN :tagNames") List findPostsByTags(@Param("tagNames") Set tagNames); + @Query("SELECT p FROM Post p " + + "LEFT JOIN p.tags t " + + "LEFT JOIN p.trainingProgram tp " + + "WHERE " + + "LOWER(p.content) LIKE LOWER(CONCAT('%', :query, '%')) OR " + + "LOWER(t.name) LIKE LOWER(CONCAT('%', :query, '%')) OR " + + "LOWER(tp.title) LIKE LOWER(CONCAT('%', :query, '%')) OR " + + "LOWER(p.user.username) LIKE LOWER(CONCAT('%', :query, '%'))") + List search(@Param("query") String query); } diff --git a/backend/demo-group7/src/main/java/com/group7/demo/repository/TrainingProgramRepository.java b/backend/demo-group7/src/main/java/com/group7/demo/repository/TrainingProgramRepository.java index c2f97e6..2b0f1e8 100644 --- a/backend/demo-group7/src/main/java/com/group7/demo/repository/TrainingProgramRepository.java +++ b/backend/demo-group7/src/main/java/com/group7/demo/repository/TrainingProgramRepository.java @@ -3,10 +3,17 @@ import com.group7.demo.models.TrainingProgram; import com.group7.demo.models.User; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import java.util.List; public interface TrainingProgramRepository extends JpaRepository { List findByTrainer(User user); + + @Query("SELECT t FROM TrainingProgram t WHERE " + + "LOWER(t.title) LIKE LOWER(CONCAT('%', :query, '%')) OR " + + "LOWER(t.description) LIKE LOWER(CONCAT('%', :query, '%'))") + List search(@Param("query") String query); } diff --git a/backend/demo-group7/src/main/java/com/group7/demo/services/SearchService.java b/backend/demo-group7/src/main/java/com/group7/demo/services/SearchService.java new file mode 100644 index 0000000..e939956 --- /dev/null +++ b/backend/demo-group7/src/main/java/com/group7/demo/services/SearchService.java @@ -0,0 +1,124 @@ +package com.group7.demo.services; + +import com.group7.demo.dtos.PostResponse; +import com.group7.demo.dtos.TrainingProgramResponse; +import com.group7.demo.dtos.mapper.Mapper; +import com.group7.demo.models.Exercise; +import com.group7.demo.models.Post; +import com.group7.demo.models.TrainingProgram; +import com.group7.demo.repository.ExerciseRepository; +import com.group7.demo.repository.PostRepository; +import com.group7.demo.repository.TrainingProgramRepository; +import org.springframework.stereotype.Service; + +import java.util.*; +import java.util.stream.Collectors; + +@Service +public class SearchService { + private final ExerciseRepository exerciseRepository; + private final PostRepository postRepository; + private final TrainingProgramRepository trainingProgramRepository; + + private final Mapper mapper; + + public SearchService(ExerciseRepository exerciseRepository, + PostRepository postRepository, + TrainingProgramRepository trainingProgramRepository, Mapper mapper) { + this.exerciseRepository = exerciseRepository; + this.postRepository = postRepository; + this.trainingProgramRepository = trainingProgramRepository; + this.mapper = mapper; + } + +// public Map search(String query) { +// Map results = new HashMap<>(); +// +// // Use the mapper for converting entities to response objects +// List postResponses = postRepository.search(query).stream() +// .map(mapper::mapToPostResponse) +// .collect(Collectors.toList()); +// +// // Map training programs (assumes you have a corresponding method in the Mapper class) +// List trainingProgramResponses = trainingProgramRepository.search(query).stream() +// .map(mapper::mapToTrainingProgramResponse) +// .collect(Collectors.toList()); +// +// // Add exercises directly if they don't need custom mapping +// List exercises = exerciseRepository.search(query); +// +// // Add to the results map +// results.put("posts", postResponses); +// results.put("trainingPrograms", trainingProgramResponses); +// results.put("exercises", exercises); +// +// return results; +// } + +// public Map search(List keywords) { +// // Search for posts, exercises, and training programs by looping over keywords +// List posts = keywords.stream() +// .flatMap(keyword -> postRepository.search(keyword).stream()) +// .distinct() // Remove duplicates +// .map(mapper::mapToPostResponse) +// .toList(); +// +// List exercises = keywords.stream() +// .flatMap(keyword -> exerciseRepository.search(keyword).stream()) +// .distinct() +// .toList(); +// +// List trainingPrograms = keywords.stream() +// .flatMap(keyword -> trainingProgramRepository.search(keyword).stream()) +// .distinct() +// .map(mapper::mapToTrainingProgramResponse) +// .toList(); +// +// // Aggregate results into a map +// Map results = new HashMap<>(); +// results.put("posts", posts); +// results.put("exercises", exercises); +// results.put("trainingPrograms", trainingPrograms); +// +// return results; +// } +public Map search(String query) { + // Split the query into individual keywords + String[] keywords = query.trim().split("\\s+"); + + // Initialize results with the first keyword + Set posts = new HashSet<>(postRepository.search(keywords[0])); + Set exercises = new HashSet<>(exerciseRepository.search(keywords[0])); + Set trainingPrograms = new HashSet<>(trainingProgramRepository.search(keywords[0])); + + // Intersect results for each subsequent keyword + for (int i = 1; i < keywords.length; i++) { + posts.retainAll(postRepository.search(keywords[i])); + exercises.retainAll(exerciseRepository.search(keywords[i])); + trainingPrograms.retainAll(trainingProgramRepository.search(keywords[i])); + } + + // Map entities to DTOs + List postResponses = posts.stream() + .map(mapper::mapToPostResponse) + .collect(Collectors.toList()); + + List exerciseResponses = exercises.stream() + .collect(Collectors.toList()); + + List trainingProgramResponses = trainingPrograms.stream() + .map(mapper::mapToTrainingProgramResponse) + .collect(Collectors.toList()); + + // Combine results into a single response + Map response = Map.of( + "posts", postResponses, + "exercises", exerciseResponses, + "trainingPrograms", trainingProgramResponses + ); + + return response; +} + + +} diff --git a/backend/demo-group7/src/main/resources/application.properties b/backend/demo-group7/src/main/resources/application.properties index 00c3355..09f6d5b 100644 --- a/backend/demo-group7/src/main/resources/application.properties +++ b/backend/demo-group7/src/main/resources/application.properties @@ -2,9 +2,9 @@ spring.application.name=backend # PostgreSQL database configuration -spring.datasource.url=jdbc:postgresql://${POSTGRES_HOST}:${POSTGRES_PORT:5432}/${POSTGRES_DB} -spring.datasource.username=${POSTGRES_USER} -spring.datasource.password=${POSTGRES_PASSWORD} +spring.datasource.url=jdbc:postgresql://localhost:5432/postgres +spring.datasource.username=postgres +spring.datasource.password=postgres # Hibernate dialect for PostgreSQL spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect @@ -15,6 +15,7 @@ spring.jpa.hibernate.ddl-auto=update # Enable SQL query logging (optional) spring.jpa.show-sql=true spring.jpa.properties.hibernate.format_sql=true +logging.level.org.hibernate.SQL=DEBUG # Server port (default to 8080) -server.port=8000 \ No newline at end of file +server.port=8000 From 0c3f861cfaceb80c55d674401177441a6548d40d Mon Sep 17 00:00:00 2001 From: Modjak Date: Sun, 24 Nov 2024 23:02:55 +0300 Subject: [PATCH 2/8] gitignore upd --- .gitignore | 10 ++++++++++ backend/demo-group7/.gitignore | 10 ++++++++++ 2 files changed, 20 insertions(+) diff --git a/.gitignore b/.gitignore index 2b11905..8793e9c 100644 --- a/.gitignore +++ b/.gitignore @@ -12,6 +12,16 @@ dist dist-ssr *.local +# Ignore Dockerfiles +Dockerfile +Dockerfile.* + +# Ignore Docker Compose files +docker-compose.yml +docker-compose.override.yml +docker-compose.*.yml + + # Editor directories and files .vscode/* !.vscode/extensions.json diff --git a/backend/demo-group7/.gitignore b/backend/demo-group7/.gitignore index f90e5dd..dad1e7a 100644 --- a/backend/demo-group7/.gitignore +++ b/backend/demo-group7/.gitignore @@ -5,6 +5,16 @@ target/ !**/src/main/**/target/ !**/src/test/**/target/ +# Ignore Dockerfiles +Dockerfile +Dockerfile.* + +# Ignore Docker Compose files +docker-compose.yml +docker-compose.override.yml +docker-compose.*.yml + + ### STS ### .apt_generated .classpath From df9b9c3b53fbb8d1f748d964fb62ec761408dcb6 Mon Sep 17 00:00:00 2001 From: Modjak Date: Sun, 24 Nov 2024 23:04:40 +0300 Subject: [PATCH 3/8] Stop tracking Docker Compose and Dockerfiles; update .gitignore --- docker-compose.yaml | 78 --------------------------------------------- frontend/Dockerfile | 24 -------------- 2 files changed, 102 deletions(-) delete mode 100644 docker-compose.yaml delete mode 100644 frontend/Dockerfile diff --git a/docker-compose.yaml b/docker-compose.yaml deleted file mode 100644 index b4885c3..0000000 --- a/docker-compose.yaml +++ /dev/null @@ -1,78 +0,0 @@ -version: '3.8' -services: - postgres: - image: postgres - container_name: postgres-db - restart: always - environment: - POSTGRES_DB: ${POSTGRES_DB:-db} - POSTGRES_USER: ${POSTGRES_USER:-postgres} - POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-postgres} - ports: - - "${POSTGRES_PORT:-5432}:5432" - volumes: - - postgres-data:/var/lib/postgresql/data - healthcheck: - test: ["CMD", "pg_isready", "-U", "${POSTGRES_USER:-postgres}"] - interval: 5s - timeout: 20s - retries: 10 - - springboot-app: - build: - context: ./backend/demo-group7 - image: springboot-app:latest - container_name: springboot-app - restart: on-failure - ports: - - "${SPRING_PORT:-8080}:8080" - environment: - SPRING_DATASOURCE_URL: jdbc:postgresql://postgres-db:${POSTGRES_PORT:-5432}/${POSTGRES_DB:-db} - SPRING_DATASOURCE_USERNAME: ${POSTGRES_USER:-postgres} - SPRING_DATASOURCE_PASSWORD: ${POSTGRES_PASSWORD:-postgres} - depends_on: - - postgres - volumes: - - ./backend/demo-group7:/app - env_file: - - .env - - frontend: - build: - context: ./frontend - image: frontend:latest - container_name: frontend - restart: on-failure - ports: - - "${VITE_PORT:-3000}:3000" - environment: - - NODE_ENV=development - - REACT_APP_API_BASE_URL=http://localhost:${SPRING_PORT:-8080} - depends_on: - - springboot-app - volumes: - - ./frontend:/app - - /app/node_modules - env_file: - - .env - - mobile: - build: - context: ./mobile - image: mobile:latest - container_name: mobile - restart: on-failure - ports: - - "${MOBILE_PORT:-3001}:3001" - environment: - - NODE_ENV=development - depends_on: - - springboot-app - volumes: - - ./mobile:/usr/src/app - - /usr/src/app/node_modules - env_file: - - .env - -volumes: - postgres-data: \ No newline at end of file diff --git a/frontend/Dockerfile b/frontend/Dockerfile deleted file mode 100644 index 67b3597..0000000 --- a/frontend/Dockerfile +++ /dev/null @@ -1,24 +0,0 @@ -# Using node:20 for the vite to work correct. -FROM node:20 - -# Set the working directory in the container -WORKDIR /app - -# Copy the current directory contents into the container at /app. But remove the node_modules folder -COPY . . - -# Remove the node_modules folder -RUN rm -rf node_modules - -# Install any needed packages specified in package.json -RUN npm install - -# Make port 3000 available for the vite app -EXPOSE 3000 - -# Define environment variable -#ENV NODE_ENV=development -ENV REACT_APP_API_BASE_URL=http://localhost:30002 - -# Run the app when the container launches -CMD ["npm", "run", "dev"] From 3eca7ffdb7f9c7eb28ecf6c4d8c4de83488b7241 Mon Sep 17 00:00:00 2001 From: Modjak Date: Sun, 24 Nov 2024 23:05:02 +0300 Subject: [PATCH 4/8] Stop tracking Docker Compose and Dockerfiles; update .gitignore --- backend/demo-group7/.gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/backend/demo-group7/.gitignore b/backend/demo-group7/.gitignore index dad1e7a..e557f4f 100644 --- a/backend/demo-group7/.gitignore +++ b/backend/demo-group7/.gitignore @@ -13,6 +13,7 @@ Dockerfile.* docker-compose.yml docker-compose.override.yml docker-compose.*.yml +../../docker-compose.yaml ### STS ### From e394fbb154dbc0fbdc393a1be81976e7f5e828c9 Mon Sep 17 00:00:00 2001 From: Modjak Date: Sun, 24 Nov 2024 23:06:37 +0300 Subject: [PATCH 5/8] Stop tracking Docker Compose and Dockerfiles; update .gitignore --- backend/demo-group7/.gitignore | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/backend/demo-group7/.gitignore b/backend/demo-group7/.gitignore index e557f4f..2212878 100644 --- a/backend/demo-group7/.gitignore +++ b/backend/demo-group7/.gitignore @@ -5,16 +5,12 @@ target/ !**/src/main/**/target/ !**/src/test/**/target/ -# Ignore Dockerfiles -Dockerfile -Dockerfile.* - -# Ignore Docker Compose files -docker-compose.yml -docker-compose.override.yml -docker-compose.*.yml -../../docker-compose.yaml +# Ignore all docker-compose files by name +docker-compose*.yaml +docker-compose*.yml +# Ignore all Dockerfiles by name +Dockerfile* ### STS ### .apt_generated From bdc06ca1839291d0c164f1e761b5f8588f7ff12e Mon Sep 17 00:00:00 2001 From: Modjak Date: Sun, 24 Nov 2024 23:07:07 +0300 Subject: [PATCH 6/8] gitignore upd --- .gitignore | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/.gitignore b/.gitignore index 8793e9c..87ec430 100644 --- a/.gitignore +++ b/.gitignore @@ -12,14 +12,12 @@ dist dist-ssr *.local -# Ignore Dockerfiles -Dockerfile -Dockerfile.* - -# Ignore Docker Compose files -docker-compose.yml -docker-compose.override.yml -docker-compose.*.yml +# Ignore all docker-compose files by name +docker-compose*.yaml +docker-compose*.yml + +# Ignore all Dockerfiles by name +Dockerfile* # Editor directories and files From 94ef1448417f23166b801929e48782ef360d3a7f Mon Sep 17 00:00:00 2001 From: Modjak Date: Sun, 24 Nov 2024 23:40:56 +0300 Subject: [PATCH 7/8] app-prop updt --- .../src/main/resources/application.properties | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/backend/demo-group7/src/main/resources/application.properties b/backend/demo-group7/src/main/resources/application.properties index 09f6d5b..00c3355 100644 --- a/backend/demo-group7/src/main/resources/application.properties +++ b/backend/demo-group7/src/main/resources/application.properties @@ -2,9 +2,9 @@ spring.application.name=backend # PostgreSQL database configuration -spring.datasource.url=jdbc:postgresql://localhost:5432/postgres -spring.datasource.username=postgres -spring.datasource.password=postgres +spring.datasource.url=jdbc:postgresql://${POSTGRES_HOST}:${POSTGRES_PORT:5432}/${POSTGRES_DB} +spring.datasource.username=${POSTGRES_USER} +spring.datasource.password=${POSTGRES_PASSWORD} # Hibernate dialect for PostgreSQL spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect @@ -15,7 +15,6 @@ spring.jpa.hibernate.ddl-auto=update # Enable SQL query logging (optional) spring.jpa.show-sql=true spring.jpa.properties.hibernate.format_sql=true -logging.level.org.hibernate.SQL=DEBUG # Server port (default to 8080) -server.port=8000 +server.port=8000 \ No newline at end of file From 8964b58bbb41cd01960a23c1668ee91a1fb7555e Mon Sep 17 00:00:00 2001 From: Modjak Date: Sun, 24 Nov 2024 23:44:22 +0300 Subject: [PATCH 8/8] Revert "Stop tracking Docker Compose and Dockerfiles; update .gitignore" This reverts commit df9b9c3b53fbb8d1f748d964fb62ec761408dcb6. --- docker-compose.yaml | 78 +++++++++++++++++++++++++++++++++++++++++++++ frontend/Dockerfile | 24 ++++++++++++++ 2 files changed, 102 insertions(+) create mode 100644 docker-compose.yaml create mode 100644 frontend/Dockerfile diff --git a/docker-compose.yaml b/docker-compose.yaml new file mode 100644 index 0000000..b4885c3 --- /dev/null +++ b/docker-compose.yaml @@ -0,0 +1,78 @@ +version: '3.8' +services: + postgres: + image: postgres + container_name: postgres-db + restart: always + environment: + POSTGRES_DB: ${POSTGRES_DB:-db} + POSTGRES_USER: ${POSTGRES_USER:-postgres} + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-postgres} + ports: + - "${POSTGRES_PORT:-5432}:5432" + volumes: + - postgres-data:/var/lib/postgresql/data + healthcheck: + test: ["CMD", "pg_isready", "-U", "${POSTGRES_USER:-postgres}"] + interval: 5s + timeout: 20s + retries: 10 + + springboot-app: + build: + context: ./backend/demo-group7 + image: springboot-app:latest + container_name: springboot-app + restart: on-failure + ports: + - "${SPRING_PORT:-8080}:8080" + environment: + SPRING_DATASOURCE_URL: jdbc:postgresql://postgres-db:${POSTGRES_PORT:-5432}/${POSTGRES_DB:-db} + SPRING_DATASOURCE_USERNAME: ${POSTGRES_USER:-postgres} + SPRING_DATASOURCE_PASSWORD: ${POSTGRES_PASSWORD:-postgres} + depends_on: + - postgres + volumes: + - ./backend/demo-group7:/app + env_file: + - .env + + frontend: + build: + context: ./frontend + image: frontend:latest + container_name: frontend + restart: on-failure + ports: + - "${VITE_PORT:-3000}:3000" + environment: + - NODE_ENV=development + - REACT_APP_API_BASE_URL=http://localhost:${SPRING_PORT:-8080} + depends_on: + - springboot-app + volumes: + - ./frontend:/app + - /app/node_modules + env_file: + - .env + + mobile: + build: + context: ./mobile + image: mobile:latest + container_name: mobile + restart: on-failure + ports: + - "${MOBILE_PORT:-3001}:3001" + environment: + - NODE_ENV=development + depends_on: + - springboot-app + volumes: + - ./mobile:/usr/src/app + - /usr/src/app/node_modules + env_file: + - .env + +volumes: + postgres-data: \ No newline at end of file diff --git a/frontend/Dockerfile b/frontend/Dockerfile new file mode 100644 index 0000000..67b3597 --- /dev/null +++ b/frontend/Dockerfile @@ -0,0 +1,24 @@ +# Using node:20 for the vite to work correct. +FROM node:20 + +# Set the working directory in the container +WORKDIR /app + +# Copy the current directory contents into the container at /app. But remove the node_modules folder +COPY . . + +# Remove the node_modules folder +RUN rm -rf node_modules + +# Install any needed packages specified in package.json +RUN npm install + +# Make port 3000 available for the vite app +EXPOSE 3000 + +# Define environment variable +#ENV NODE_ENV=development +ENV REACT_APP_API_BASE_URL=http://localhost:30002 + +# Run the app when the container launches +CMD ["npm", "run", "dev"]