diff --git a/services/backend/api/v1/competition/views.py b/services/backend/api/v1/competition/views.py index 1f7eb77..4dacad9 100644 --- a/services/backend/api/v1/competition/views.py +++ b/services/backend/api/v1/competition/views.py @@ -13,7 +13,7 @@ router = Router(tags=["competition"]) @router.get( - "competition/{competition_id}", + "competitions/{competition_id}", response={ status.OK: schemas.CompetitionOut, status.BAD_REQUEST: global_schemas.BadRequestError, diff --git a/services/backend/api/v1/user/views.py b/services/backend/api/v1/user/views.py index c9fad87..2b9cdbe 100644 --- a/services/backend/api/v1/user/views.py +++ b/services/backend/api/v1/user/views.py @@ -75,7 +75,7 @@ def get_me(request): @router.get( - path="/user/{user_id}", + path="/users/{user_id}", response={ status.OK: UserSchema, status.BAD_REQUEST: BadRequestError, diff --git a/services/backend/apps/achievement/migrations/0005_alter_achievement_icon.py b/services/backend/apps/achievement/migrations/0005_alter_achievement_icon.py new file mode 100644 index 0000000..7ed0851 --- /dev/null +++ b/services/backend/apps/achievement/migrations/0005_alter_achievement_icon.py @@ -0,0 +1,19 @@ +# Generated by Django 5.1.6 on 2025-03-02 14:03 + +import apps.achievement.models +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('achievement', '0003_remove_achievement_need_count_and_more_squashed_0004_alter_achievement_slug'), + ] + + operations = [ + migrations.AlterField( + model_name='achievement', + name='icon', + field=models.ImageField(upload_to=apps.achievement.models.Achievement.image_url_upload_to, verbose_name='иконка достижения'), + ), + ] diff --git a/services/backend/apps/achievement/models.py b/services/backend/apps/achievement/models.py index 2c7724f..292598f 100644 --- a/services/backend/apps/achievement/models.py +++ b/services/backend/apps/achievement/models.py @@ -14,7 +14,7 @@ class Achievement(BaseModel): max_length=30, verbose_name="название", unique=True ) description = models.TextField(verbose_name="описание") - icon = models.FileField( + icon = models.ImageField( verbose_name="иконка достижения", upload_to=image_url_upload_to, ) diff --git a/services/frontend/src/pages/CompetitionSession/modules/TaskSolution/index.tsx b/services/frontend/src/pages/CompetitionSession/modules/TaskSolution/index.tsx index afe22d4..ea0c35c 100644 --- a/services/frontend/src/pages/CompetitionSession/modules/TaskSolution/index.tsx +++ b/services/frontend/src/pages/CompetitionSession/modules/TaskSolution/index.tsx @@ -43,7 +43,7 @@ const TaskSolution: React.FC = ({ setIsHistoryOpen(true); }; - const latestSolution = solutionHistory && solutionHistory.length > 0 ? solutionHistory[0] : null; + const latestSolution = solutionHistory && solutionHistory.length > 0 ? solutionHistory[solutionHistory.length - 1] : null; return (
diff --git a/services/frontend/src/shared/api/competitions.ts b/services/frontend/src/shared/api/competitions.ts index 8c47564..eea1533 100644 --- a/services/frontend/src/shared/api/competitions.ts +++ b/services/frontend/src/shared/api/competitions.ts @@ -10,7 +10,7 @@ export const getCompetitions = async (participating?: boolean) => { }; export const getCompetition = async (id: string) => { - return await userFetch(`/competition/${id}`); + return await userFetch(`/competitions/${id}`); }; export const startCompetition = async (competitionId: string) => { diff --git a/services/frontend/src/shared/api/session.ts b/services/frontend/src/shared/api/session.ts index 6cfe8f2..4a04dc4 100644 --- a/services/frontend/src/shared/api/session.ts +++ b/services/frontend/src/shared/api/session.ts @@ -20,18 +20,18 @@ export const submitTaskSolution = async ( solution: string | File ) => { const endpoint = `/competitions/${competitionId}/tasks/${taskId}/submit`; + const formData = new FormData(); + + // туповатый костыль но для мвп сойдет if (typeof solution === 'string') { - return await userFetch(endpoint, { - method: 'POST', - body: { content: solution } - }); + const textFile = new File([solution], 'solution.txt', { type: 'text/plain' }); + formData.append('content', textFile); } else { - const formData = new FormData(); - formData.append('content', solution); - - return await userFetch(endpoint, { - method: 'POST', - body: formData - }); + formData.append('content', solution); } + + return await userFetch(endpoint, { + method: 'POST', + body: formData + }); }; \ No newline at end of file