diff --git a/docker-compose.yml b/docker-compose.yml index 85fc028..c726b1b 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -8,8 +8,10 @@ services: - 5000 labels: - "traefik.enable=true" - - "traefik.http.routers.py-genai-helper.entrypoints=py-genai-helper" - - "traefik.http.routers.py-genai-helper.rule=PathPrefix(`/`)" + - "traefik.http.routers.py-genai-helper.entrypoints=web" + - "traefik.http.routers.py-genai-helper.rule=PathPrefix(`/api/v1/helper`)" + - "traefik.http.middlewares.helper-stripprefix.stripprefix.prefixes=/api/v1/helper" + - "traefik.http.routers.py-genai-helper.middlewares=helper-stripprefix" - "traefik.http.services.py-genai-helper.loadbalancer.server.port=5000" networks: - proxy @@ -29,8 +31,10 @@ services: - SPRING_JPA_HIBERNATE_DDL_AUTO=update labels: - "traefik.enable=true" - - "traefik.http.routers.organization-service.entrypoints=organization-service" - - "traefik.http.routers.organization-service.rule=PathPrefix(`/`)" + - "traefik.http.routers.organization-service.entrypoints=web" + - "traefik.http.routers.organization-service.rule=PathPrefix(`/api/v1/organization`)" + - "traefik.http.middlewares.organization-stripprefix.stripprefix.prefixes=/api/v1/organization" + - "traefik.http.routers.organization-service.middlewares=organization-stripprefix" - "traefik.http.services.organization-service.loadbalancer.server.port=8080" networks: - proxy @@ -51,8 +55,10 @@ services: - SPRING_JPA_HIBERNATE_DDL_AUTO=update labels: - "traefik.enable=true" - - "traefik.http.routers.member-service.entrypoints=member-service" - - "traefik.http.routers.member-service.rule=PathPrefix(`/`)" + - "traefik.http.routers.member-service.entrypoints=web" + - "traefik.http.routers.member-service.rule=PathPrefix(`/api/v1/members`)" + - "traefik.http.middlewares.member-stripprefix.stripprefix.prefixes=/api/v1/members" + - "traefik.http.routers.member-service.middlewares=member-stripprefix" - "traefik.http.services.member-service.loadbalancer.server.port=8080" networks: - proxy @@ -73,8 +79,10 @@ services: - SPRING_JPA_HIBERNATE_DDL_AUTO=update labels: - "traefik.enable=true" - - "traefik.http.routers.event-service.entrypoints=event-service" - - "traefik.http.routers.event-service.rule=PathPrefix(`/`)" + - "traefik.http.routers.event-service.entrypoints=web" + - "traefik.http.routers.event-service.rule=PathPrefix(`/api/v1/events`)" + - "traefik.http.middlewares.event-stripprefix.stripprefix.prefixes=/api/v1/events" + - "traefik.http.routers.event-service.middlewares=event-stripprefix" - "traefik.http.services.event-service.loadbalancer.server.port=8080" networks: - proxy @@ -95,8 +103,10 @@ services: - SPRING_JPA_HIBERNATE_DDL_AUTO=update labels: - "traefik.enable=true" - - "traefik.http.routers.feedback-service.entrypoints=feedback-service" - - "traefik.http.routers.feedback-service.rule=PathPrefix(`/`)" + - "traefik.http.routers.feedback-service.entrypoints=web" + - "traefik.http.routers.feedback-service.rule=PathPrefix(`/api/v1/feedback`)" + - "traefik.http.middlewares.feedback-stripprefix.stripprefix.prefixes=/api/v1/feedback" + - "traefik.http.routers.feedback-service.middlewares=feedback-stripprefix" - "traefik.http.services.feedback-service.loadbalancer.server.port=8080" networks: - proxy @@ -117,8 +127,10 @@ services: - SPRING_JPA_HIBERNATE_DDL_AUTO=update labels: - "traefik.enable=true" - - "traefik.http.routers.finance-service.entrypoints=finance-service" - - "traefik.http.routers.finance-service.rule=PathPrefix(`/`)" + - "traefik.http.routers.finance-service.entrypoints=web" + - "traefik.http.routers.finance-service.rule=PathPrefix(`/api/v1/finances`)" + - "traefik.http.middlewares.finance-stripprefix.stripprefix.prefixes=/api/v1/finances" + - "traefik.http.routers.finance-service.middlewares=finance-stripprefix" - "traefik.http.services.finance-service.loadbalancer.server.port=8080" networks: - proxy @@ -139,8 +151,10 @@ services: - SPRING_JPA_HIBERNATE_DDL_AUTO=update labels: - "traefik.enable=true" - - "traefik.http.routers.letter-service.entrypoints=letter-service" - - "traefik.http.routers.letter-service.rule=PathPrefix(`/`)" + - "traefik.http.routers.letter-service.entrypoints=web" + - "traefik.http.routers.letter-service.rule=PathPrefix(`/api/v1/letters`)" + - "traefik.http.middlewares.letter-stripprefix.stripprefix.prefixes=/api/v1/letters" + - "traefik.http.routers.letter-service.middlewares=letter-stripprefix" - "traefik.http.services.letter-service.loadbalancer.server.port=8080" networks: - proxy @@ -161,7 +175,7 @@ services: - py-genai-helper labels: - "traefik.enable=true" - - "traefik.http.routers.web-client.entrypoints=web-client" + - "traefik.http.routers.web-client.entrypoints=web" - "traefik.http.routers.web-client.rule=PathPrefix(`/`)" - "traefik.http.services.web-client.loadbalancer.server.port=8080" networks: @@ -175,23 +189,9 @@ services: - "--providers.docker=true" - "--providers.docker.exposedByDefault=false" - "--providers.docker.network=proxy" - - "--entrypoints.py-genai-helper.address=:5000" - - "--entrypoints.organization-service.address=:8001" - - "--entrypoints.member-service.address=:8002" - - "--entrypoints.event-service.address=:8003" - - "--entrypoints.feedback-service.address=:8004" - - "--entrypoints.finance-service.address=:8005" - - "--entrypoints.letter-service.address=:8006" - - "--entrypoints.web-client.address=:3000" + - "--entrypoints.web.address=:80" ports: - - "3000:3000" - - "5000:5000" - - "8001:8001" - - "8002:8002" - - "8003:8003" - - "8004:8004" - - "8005:8005" - - "8006:8006" + - "80:80" - "8080:8080" volumes: - /var/run/docker.sock:/var/run/docker.sock:ro diff --git a/web-client/src/app/router/AppRouter.tsx b/web-client/src/app/router/AppRouter.tsx index dfd26e3..8f4d482 100644 --- a/web-client/src/app/router/AppRouter.tsx +++ b/web-client/src/app/router/AppRouter.tsx @@ -1,8 +1,10 @@ import { NavLink, Navigate, Route, Routes } from 'react-router-dom' import { useEffect, useState } from 'react' import { getEventsHello } from '@/features/events/api' +import { getFeedbackHello } from '@/features/feedback/api' import { getLettersHello } from '@/features/letters/api' import { getMembersHello } from '@/features/members/api' +import { getOrganizationHello } from '@/features/organization/api' import { getPaymentsHello } from '@/features/payments/api' type ServicePlaceholderPageProps = { @@ -70,6 +72,8 @@ export function AppRouter() { Events Payments Letters + Organization + Feedback @@ -93,6 +97,14 @@ export function AppRouter() { path="/letters" element={} /> + } + /> + } + /> diff --git a/web-client/src/features/events/api.ts b/web-client/src/features/events/api.ts index 09b7d33..e308447 100644 --- a/web-client/src/features/events/api.ts +++ b/web-client/src/features/events/api.ts @@ -1,14 +1,6 @@ -import type { HelloResponse } from '@/features/events/types' - -function mockEventsHello(): Promise { - return Promise.resolve({ - service: 'event-service', - message: 'Hello from event-service (mock placeholder)', - }) -} +import { eventsClient } from '@/features/events/client' export async function getEventsHello(): Promise { - // TODO: Replace mock with real endpoint when backend is available. - const data = await mockEventsHello() - return `${data.service}: ${data.message}` + const res = await eventsClient.get('/hello') + return res.data } diff --git a/web-client/src/features/events/client.ts b/web-client/src/features/events/client.ts new file mode 100644 index 0000000..b9f66de --- /dev/null +++ b/web-client/src/features/events/client.ts @@ -0,0 +1,5 @@ +import axios from 'axios' + +export const eventsClient = axios.create({ + baseURL: '/api/v1/events', +}) diff --git a/web-client/src/features/events/types.ts b/web-client/src/features/events/types.ts deleted file mode 100644 index e1abb1a..0000000 --- a/web-client/src/features/events/types.ts +++ /dev/null @@ -1,4 +0,0 @@ -export type HelloResponse = { - service: string - message: string -} diff --git a/web-client/src/features/feedback/api.ts b/web-client/src/features/feedback/api.ts new file mode 100644 index 0000000..80b939f --- /dev/null +++ b/web-client/src/features/feedback/api.ts @@ -0,0 +1,6 @@ +import { feedbackClient } from '@/features/feedback/client' + +export async function getFeedbackHello(): Promise { + const res = await feedbackClient.get('/hello') + return res.data +} diff --git a/web-client/src/features/feedback/client.ts b/web-client/src/features/feedback/client.ts new file mode 100644 index 0000000..4a77acc --- /dev/null +++ b/web-client/src/features/feedback/client.ts @@ -0,0 +1,5 @@ +import axios from 'axios' + +export const feedbackClient = axios.create({ + baseURL: '/api/v1/feedback', +}) diff --git a/web-client/src/features/letters/api.ts b/web-client/src/features/letters/api.ts index 831af2a..c6f1b69 100644 --- a/web-client/src/features/letters/api.ts +++ b/web-client/src/features/letters/api.ts @@ -1,14 +1,6 @@ -import type { HelloResponse } from '@/features/letters/types' - -function mockLettersHello(): Promise { - return Promise.resolve({ - service: 'letter-service', - message: 'Hello from letter-service (mock placeholder)', - }) -} +import { lettersClient } from '@/features/letters/client' export async function getLettersHello(): Promise { - // TODO: Replace mock with real endpoint when backend is available. - const data = await mockLettersHello() - return `${data.service}: ${data.message}` + const res = await lettersClient.get('/hello') + return res.data } diff --git a/web-client/src/features/letters/client.ts b/web-client/src/features/letters/client.ts new file mode 100644 index 0000000..d977eaa --- /dev/null +++ b/web-client/src/features/letters/client.ts @@ -0,0 +1,5 @@ +import axios from 'axios' + +export const lettersClient = axios.create({ + baseURL: '/api/v1/letters', +}) diff --git a/web-client/src/features/letters/types.ts b/web-client/src/features/letters/types.ts deleted file mode 100644 index e1abb1a..0000000 --- a/web-client/src/features/letters/types.ts +++ /dev/null @@ -1,4 +0,0 @@ -export type HelloResponse = { - service: string - message: string -} diff --git a/web-client/src/features/members/api.ts b/web-client/src/features/members/api.ts index 0e47770..8ccde2c 100644 --- a/web-client/src/features/members/api.ts +++ b/web-client/src/features/members/api.ts @@ -1,14 +1,6 @@ -import type { HelloResponse } from '@/features/members/types' - -function mockMembersHello(): Promise { - return Promise.resolve({ - service: 'member-service', - message: 'Hello from member-service (mock placeholder)', - }) -} +import { membersClient } from '@/features/members/client' export async function getMembersHello(): Promise { - // TODO: Replace mock with real endpoint when backend is available. - const data = await mockMembersHello() - return `${data.service}: ${data.message}` + const res = await membersClient.get('/hello') + return res.data } diff --git a/web-client/src/features/members/client.ts b/web-client/src/features/members/client.ts new file mode 100644 index 0000000..303cb4d --- /dev/null +++ b/web-client/src/features/members/client.ts @@ -0,0 +1,5 @@ +import axios from 'axios' + +export const membersClient = axios.create({ + baseURL: '/api/v1/members', +}) diff --git a/web-client/src/features/members/types.ts b/web-client/src/features/members/types.ts deleted file mode 100644 index e1abb1a..0000000 --- a/web-client/src/features/members/types.ts +++ /dev/null @@ -1,4 +0,0 @@ -export type HelloResponse = { - service: string - message: string -} diff --git a/web-client/src/features/organization/api.ts b/web-client/src/features/organization/api.ts new file mode 100644 index 0000000..76f6b0e --- /dev/null +++ b/web-client/src/features/organization/api.ts @@ -0,0 +1,6 @@ +import { organizationClient } from '@/features/organization/client' + +export async function getOrganizationHello(): Promise { + const res = await organizationClient.get('/hello') + return res.data +} diff --git a/web-client/src/features/organization/client.ts b/web-client/src/features/organization/client.ts new file mode 100644 index 0000000..7e8f941 --- /dev/null +++ b/web-client/src/features/organization/client.ts @@ -0,0 +1,5 @@ +import axios from 'axios' + +export const organizationClient = axios.create({ + baseURL: '/api/v1/organization', +}) diff --git a/web-client/src/features/payments/api.ts b/web-client/src/features/payments/api.ts index 8dc5323..bb6f870 100644 --- a/web-client/src/features/payments/api.ts +++ b/web-client/src/features/payments/api.ts @@ -1,14 +1,6 @@ -import type { HelloResponse } from '@/features/payments/types' - -function mockPaymentsHello(): Promise { - return Promise.resolve({ - service: 'payment-service', - message: 'Hello from payment-service (mock placeholder)', - }) -} +import { paymentsClient } from '@/features/payments/client' export async function getPaymentsHello(): Promise { - // TODO: Replace mock with real endpoint when backend is available. - const data = await mockPaymentsHello() - return `${data.service}: ${data.message}` + const res = await paymentsClient.get('/hello') + return res.data } diff --git a/web-client/src/features/payments/client.ts b/web-client/src/features/payments/client.ts new file mode 100644 index 0000000..29e2d1a --- /dev/null +++ b/web-client/src/features/payments/client.ts @@ -0,0 +1,5 @@ +import axios from 'axios' + +export const paymentsClient = axios.create({ + baseURL: '/api/v1/finances', +}) diff --git a/web-client/src/features/payments/types.ts b/web-client/src/features/payments/types.ts deleted file mode 100644 index e1abb1a..0000000 --- a/web-client/src/features/payments/types.ts +++ /dev/null @@ -1,4 +0,0 @@ -export type HelloResponse = { - service: string - message: string -}