Skip to content

Commit 01df41d

Browse files
authored
Merge pull request #58 from kilobyteno/develop
2 parents 42520ce + aa38b53 commit 01df41d

File tree

18 files changed

+231
-125
lines changed

18 files changed

+231
-125
lines changed

.github/workflows/release.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ name: "Release"
22

33
on:
44
release:
5-
types: [ released ]
5+
types: [ published ]
66

77
jobs:
88
update-changelog:
@@ -11,7 +11,7 @@ jobs:
1111
- name: Checkout code
1212
uses: actions/checkout@v4
1313
with:
14-
ref: main
14+
ref: develop
1515

1616
- name: Update Changelog
1717
uses: stefanzweifel/changelog-updater-action@v1
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
"""Add event interest
2+
3+
Revision ID: 9ef2bf852502
4+
Revises: 8430b1ac53fe
5+
Create Date: 2024-12-29 16:53:42.535531
6+
7+
"""
8+
from typing import Sequence, Union
9+
10+
from alembic import op
11+
import sqlalchemy as sa
12+
13+
14+
# revision identifiers, used by Alembic.
15+
revision: str = '9ef2bf852502'
16+
down_revision: Union[str, None] = '8430b1ac53fe'
17+
branch_labels: Union[str, Sequence[str], None] = None
18+
depends_on: Union[str, Sequence[str], None] = None
19+
20+
21+
def upgrade() -> None:
22+
# ### commands auto generated by Alembic - please adjust! ###
23+
op.create_table('event_interests',
24+
sa.Column('id', sa.UUID(), nullable=False),
25+
sa.Column('event_id', sa.UUID(), nullable=False),
26+
sa.Column('user_id', sa.UUID(), nullable=False),
27+
sa.Column('status', sa.Integer(), nullable=False),
28+
sa.Column('created_at', sa.DateTime(), server_default=sa.text('now()'), nullable=True),
29+
sa.Column('updated_at', sa.DateTime(), nullable=True),
30+
sa.Column('deleted_at', sa.DateTime(), nullable=True),
31+
sa.ForeignKeyConstraint(['event_id'], ['events.id'], ),
32+
sa.ForeignKeyConstraint(['user_id'], ['users.id'], ),
33+
sa.PrimaryKeyConstraint('id'),
34+
sa.UniqueConstraint('id')
35+
)
36+
# ### end Alembic commands ###
37+
38+
39+
def downgrade() -> None:
40+
# ### commands auto generated by Alembic - please adjust! ###
41+
op.drop_table('event_interests')
42+
# ### end Alembic commands ###

backend/app/models/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
from app.models import base, event, organisation, user # noqa: F401
1+
from app.models import base, event, event_interest, organisation, user # noqa: F401

backend/app/models/event_interest.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
from sqlalchemy import UUID, Column, ForeignKey, Integer
2-
from sqlalchemy.orm import relationship
2+
from sqlalchemy.orm import declarative_base, relationship
33

44
from app.models.base import BaseModel
55

6+
Base = declarative_base()
7+
68

79
class EventInterest(BaseModel):
810
"""Event interest model - tracks user's interest in attending an event"""

backend/app/v3/api.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,5 +17,5 @@
1717
router.include_router(user_endpoints.router, tags=['user'], prefix='/user')
1818
router.include_router(organisations_endpoints.router, tags=['organisations'], prefix='/organisations')
1919
router.include_router(events_endpoints.router, tags=['events'], prefix='/events')
20-
router.include_router(event_interests_endpoints.router, tags=['event interests'], prefix='/event-interests')
20+
router.include_router(event_interests_endpoints.router, tags=['event interests'])
2121
router.include_router(system_endpoints.router, tags=['system'], prefix='/system') # Should be last

backend/app/v3/event_interests/endpoints.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121

2222

2323
@router.post(
24-
'/{event_id}',
24+
'/events/{event_id}/interests',
2525
name='EI-1',
2626
response_model=EventInterestResponse,
2727
)
@@ -33,7 +33,7 @@ async def post_create_interest(
3333

3434

3535
@router.get(
36-
'/{event_id}',
36+
'/events/{event_id}/interests',
3737
name='EI-2',
3838
response_model=List[EventInterestResponse],
3939
)
@@ -43,7 +43,7 @@ async def get_interests_list(event_id: UUID, skip: int = 0, limit: int = 100, db
4343

4444

4545
@router.put(
46-
'/{event_id}',
46+
'/events/{event_id}/interests',
4747
name='EI-3',
4848
response_model=EventInterestResponse,
4949
)
@@ -55,7 +55,7 @@ async def put_update_interest(
5555

5656

5757
@router.get(
58-
'/{event_id}/me',
58+
'/events/{event_id}/interests/me',
5959
name='EI-4',
6060
response_model=EventInterestResponse,
6161
)
@@ -64,7 +64,7 @@ async def get_my_interest(event_id: UUID, current_user: User = Depends(get_curre
6464
return get_user_interest(db=db, event_id=event_id, current_user=current_user)
6565

6666

67-
@router.get('/{event_id}/count', name='EI-5', response_model=EventInterestCountResponse)
67+
@router.get('/events/{event_id}/interests/count', name='EI-5', response_model=EventInterestCountResponse)
6868
async def get_interest_count(event_id: UUID, db: Session = Depends(get_db)) -> JSONResponse:
6969
"""Get count of interests for an event"""
7070
return get_event_interest_count(db=db, event_id=event_id)

docker-compose.yml

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
version: '3.8'
2+
3+
services:
4+
frontend:
5+
build:
6+
context: ./frontend
7+
dockerfile: Dockerfile
8+
args:
9+
- BUILD_ENV=${BUILD_ENV:-production}
10+
ports:
11+
- "${FRONTEND_PORT:-8080}:8080"
12+
environment:
13+
- VITE_ENV=${VITE_ENV:-production}
14+
- VITE_CORE_API_URL=${VITE_CORE_API_URL:-http://backend:8000/v3}
15+
networks:
16+
- app-network
17+
depends_on:
18+
- backend
19+
restart: unless-stopped
20+
healthcheck:
21+
test: ["CMD", "wget", "--spider", "-q", "http://localhost:8080"]
22+
interval: 30s
23+
timeout: 10s
24+
retries: 3
25+
26+
backend:
27+
build:
28+
context: ./backend
29+
dockerfile: Dockerfile
30+
ports:
31+
- "${BACKEND_PORT:-8000}:8000"
32+
environment:
33+
- DB_HOST=${DB_HOST:-db}
34+
- DB_USERNAME=${DB_USERNAME:-postgres}
35+
- DB_PASSWORD=${DB_PASSWORD}
36+
- DB_PORT=${DB_PORT:-5432}
37+
- DB_DIALECT=${DB_DIALECT:-postgresql}
38+
- DB_NAME=${DB_NAME:-postgres}
39+
- ENV=${ENV:-production}
40+
depends_on:
41+
db:
42+
condition: service_healthy
43+
restart: unless-stopped
44+
networks:
45+
- app-network
46+
- db-network
47+
healthcheck:
48+
test: ["CMD", "curl", "-f", "http://localhost:8000/v3/system/up"]
49+
interval: 30s
50+
timeout: 10s
51+
retries: 3
52+
53+
db:
54+
build:
55+
context: ./postgres
56+
dockerfile: Dockerfile
57+
ports:
58+
- "${DB_PORT:-5432}:5432"
59+
environment:
60+
- POSTGRES_USER=${DB_USERNAME:-postgres}
61+
- POSTGRES_PASSWORD=${DB_PASSWORD}
62+
- POSTGRES_DB=${DB_NAME:-postgres}
63+
- POSTGRES_HOST_AUTH_METHOD=${POSTGRES_HOST_AUTH_METHOD:-trust}
64+
volumes:
65+
- postgres_data:/var/lib/postgresql/data
66+
networks:
67+
- db-network
68+
restart: unless-stopped
69+
healthcheck:
70+
test: ["CMD-SHELL", "pg_isready -U postgres"]
71+
interval: 10s
72+
timeout: 5s
73+
retries: 5
74+
75+
networks:
76+
app-network:
77+
driver: bridge
78+
db-network:
79+
driver: bridge
80+
81+
volumes:
82+
postgres_data:
83+
driver: local

frontend/src/components/nav-user.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import {
2020
SidebarMenuItem,
2121
useSidebar,
2222
} from "@/components/ui/sidebar"
23-
import {CaretUpDown, Password, SignOut, UserSwitch} from "@phosphor-icons/react";
23+
import {CaretUpDown, SignOut, UserSwitch} from "@phosphor-icons/react";
2424
import {useAuth} from "@/context/AuthContext";
2525
import {useTranslation} from "react-i18next";
2626
import {RouteConfig} from "@/routes/route-config";

frontend/src/lib/api/client.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ apiClient.interceptors.response.use(
140140
}
141141

142142
// Show error toast for all other errors
143-
if (error.response?.status !== 401) {
143+
if (error.response?.status !== 401 && error.response?.status !== 404) {
144144
toast({
145145
title: "Error",
146146
description: getErrorMessage(error),

frontend/src/lib/api/event-interest.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,9 @@ export type EI4Output = ApiResponse<EventInterest>;
2121
export type EI5Output = ApiResponse<EventInterestCount>;
2222

2323
export const eventInterestApi = {
24-
create: (event_id: string, data: EventInterest) => apiClient.post<EI1Output>(`/event-interests/${event_id}`, data),
25-
get: (event_id: string) => apiClient.get<EI2Output>(`/event-interests/${event_id}`),
26-
update: (event_id: string, data: EventInterest) => apiClient.put<EI3Output>(`/event-interests/${event_id}`, data),
27-
getMe: (event_id: string) => apiClient.get<EI4Output>(`/event-interests/${event_id}/me`),
28-
getCount: (event_id: string) => apiClient.get<EI5Output>(`/event-interests/${event_id}/count`),
29-
};
24+
create: (event_id: string, data: EventInterest) => apiClient.post<EI1Output>(`/events/${event_id}/interests`, data),
25+
get: (event_id: string) => apiClient.get<EI2Output>(`/events/${event_id}/interests`),
26+
update: (event_id: string, data: EventInterest) => apiClient.put<EI3Output>(`/events/${event_id}/interests`, data),
27+
getMe: (event_id: string) => apiClient.get<EI4Output>(`/events/${event_id}/interests/me`),
28+
getCount: (event_id: string) => apiClient.get<EI5Output>(`/events/${event_id}/interests/count`),
29+
};

0 commit comments

Comments
 (0)