diff --git a/back/api.py b/back/api.py index 837d0a7..dc30120 100644 --- a/back/api.py +++ b/back/api.py @@ -33,8 +33,8 @@ if not os.path.exists("./uploads"): os.mkdir("./uploads") app.mount("/uploads", StaticFiles(directory = "./uploads")) -## Записываем стихи в базу данных, если их еще нет (запускать только если стихов в базе нет). -# service.add_poems_to_db(database) +# Записываем стихи в базу данных, если их еще нет (запускать только если стихов в базе нет). +# add_poems_to_db(database) @app.get("/api/announcements", response_model=List[schemas.Announcement])#адрес объявлений @@ -43,7 +43,7 @@ def announcements_list(db: Annotated[Session, Depends(utils.get_db)], obsolete: # параметры для сортировки (схема pydantic schemas.SortAnnouncements) params_to_sort = schemas.SortAnnouncements(obsolete=obsolete, user_id=user_id, metro=metro, category=category) # получаем результат - result = service.filter_ann(db=db, schema=params_to_sort) + result = get_query_results(db=db, schema=params_to_sort) return result @@ -95,20 +95,14 @@ def put_in_db(name: Annotated[str, Form()], category: Annotated[str, Form()], be # Удалить объявления из базы @app.delete("/api/announcement") #адрес объявления -def delete_from_db(announcement: schemas.DelAnnouncement, db: Annotated[Session, Depends(utils.get_db)], - current_user: Annotated[schemas.User, Depends(utils.get_current_active_user)]): # функция удаления объекта из БД - # находим объявление в бд по id - to_delete = db.query(models.Announcement).filter(models.Announcement.id==announcement.id).first() - # Проверяем, что объявление с данным id существует - if not to_delete: - raise HTTPException(status_code=404, detail="Item not found") - # Проверяем, что объявление удаляет владелец - if current_user.id == to_delete.user_id: +def delete_from_db(announcement: schemas.DelAnnouncement, db: Annotated[Session, Depends(utils.get_db)]): # функция удаления объекта из БД + try: + to_delete = db.query(models.Announcement).filter(models.Announcement.id==announcement.id).first() db.delete(to_delete) # удаление из БД db.commit() # сохраняем изменения return {"Answer" : True} - else: - raise HTTPException(status_code=403, detail="Can't delete other user's announcements") + except: + return {"Answer" : False} # Забронировать объявление @@ -202,25 +196,22 @@ def poems_to_front(db: Annotated[Session, Depends(utils.get_db)]): # db: Annotat if not poem: raise HTTPException(status_code=404, detail="Poem not found") return poem - @app.get("/api/trashbox", response_model=List[schemas.TrashboxResponse]) -def get_trashboxes(data: schemas.TrashboxRequest = Depends()):#крутая функция для работы с api +def get_trashboxes(Lat:float, Lng:float, Category:str):#крутая функция для работы с api # json, передаваемый стороннему API BASE_URL= "https://geointelect2.gate.petersburg.ru" my_token="eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJhU1RaZm42bHpTdURYcUttRkg1SzN5UDFhT0FxUkhTNm9OendMUExaTXhFIn0.eyJleHAiOjE3ODYyMjUzMzMsImlhdCI6MTY5MTUzMDkzMywianRpIjoiYjU0MmU3MTQtYzJkMS00NTY2LWJkY2MtYmQ5NzA0ODY1ZjgzIiwiaXNzIjoiaHR0cHM6Ly9rYy5wZXRlcnNidXJnLnJ1L3JlYWxtcy9lZ3MtYXBpIiwiYXVkIjoiYWNjb3VudCIsInN1YiI6ImJjYjQ2NzljLTU3ZGItNDU5ZC1iNWUxLWRlOGI4Yzg5MTMwMyIsInR5cCI6IkJlYXJlciIsImF6cCI6ImFkbWluLXJlc3QtY2xpZW50Iiwic2Vzc2lvbl9zdGF0ZSI6IjJhOTgwMzUyLTY1M2QtNGZlZC1iMDI1LWQ1N2U0NDRjZmM3NiIsImFjciI6IjEiLCJhbGxvd2VkLW9yaWdpbnMiOlsiLyoiXSwicmVhbG1fYWNjZXNzIjp7InJvbGVzIjpbImRlZmF1bHQtcm9sZXMtZWdzLWFwaSIsIm9mZmxpbmVfYWNjZXNzIiwidW1hX2F1dGhvcml6YXRpb24iXX0sInJlc291cmNlX2FjY2VzcyI6eyJhY2NvdW50Ijp7InJvbGVzIjpbIm1hbmFnZS1hY2NvdW50IiwibWFuYWdlLWFjY291bnQtbGlua3MiLCJ2aWV3LXByb2ZpbGUiXX19LCJzY29wZSI6ImVtYWlsIHByb2ZpbGUiLCJzaWQiOiIyYTk4MDM1Mi02NTNkLTRmZWQtYjAyNS1kNTdlNDQ0Y2ZjNzYiLCJlbWFpbF92ZXJpZmllZCI6ZmFsc2UsIm5hbWUiOiLQktC70LDQtNC40LzQuNGAINCv0LrQvtCy0LvQtdCyIiwicHJlZmVycmVkX3VzZXJuYW1lIjoiZTBmYzc2OGRhOTA4MjNiODgwZGQzOGVhMDJjMmQ5NTciLCJnaXZlbl9uYW1lIjoi0JLQu9Cw0LTQuNC80LjRgCIsImZhbWlseV9uYW1lIjoi0K_QutC-0LLQu9C10LIifQ.FTKiC1hpWcOkmSW9QZpC-RY7Ko50jw1mDMfXIWYxlQ-zehLm2CLmOnHvYoOoI39k2OzeCIAB9ZdRrrGZc6G9Z1eFELUjNGEqKxSC1Phj9ATemKgbOKEttk-OGc-rFr9VPA8_SnfvLts6wTI2YK33YBIxCF5nCbnr4Qj3LeEQ0d6Hy8PO4ATrBF5EOeuAZRprvIEjXe_f8N9ONKckCPB-xFB4P2pZlVXGoCNoewGEcY3zXH4khezN6zcVr6tpc6G8dBv9EqT_v92IDSg-aXQk6ysA0cO0-6x5w1-_qU0iHGIAPsLNV9IKBoFbjc0JH6cWabldPRH12NP1trvYfqKDGQ" head = {'Authorization': 'Bearer {}'.format(my_token)} - + # Данные пользователя (местоположение, количество мусорок, которое пользователь хочет видеть) my_data={ - 'x' : f"{data.Lng}", - 'y' : f"{data.Lat}", + 'x' : f"{Lng}", + 'y' : f"{Lat}", 'limit' : '1' } - - - list_of_category = [] # лист по которому будет отбираться uniq_trashboxes - match data.Category: + # Перевод категории с фронта на категорию с сайта + match Category: case "PORRIDGE": list_of_category = ["Опасные отходы", "Иное"] case "Конспекты": @@ -238,9 +229,10 @@ def get_trashboxes(data: schemas.TrashboxRequest = Depends()):#крутая фу case "Всякая всячина": list_of_category = ["Металл", "Бумага", "Стекло", "Иное", "Тетра Пак", "Батарейки", "Крышечки", "Шины", "Опасные отходы", "Лампочки", "Пластик"] - - response = requests.post(f"{BASE_URL}/nearest_recycling/get", headers=head, data=my_data) + # Получение ответа от стороннего апи + response = requests.post(f"{BASE_URL}/nearest_recycling/get", headers=head, data=my_data, timeout=10) infos = response.json() + # Чтение ответа trashboxes = [] for trashbox in infos["results"]: temp_dict = {} @@ -253,10 +245,11 @@ def get_trashboxes(data: schemas.TrashboxRequest = Depends()):#крутая фу temp_dict["Name"] = properties["title"] temp_dict["Address"] = properties["address"] temp_dict["Categories"] = properties["content_text"].split(',') - trashboxes.append(temp_dict) - - uniq_trashboxes = [schemas.TrashboxResponse(**ast.literal_eval(el1)) for el1 in set([str(el2) for el2 in trashboxes])] - return uniq_trashboxes + for a in list_of_category: + if a in temp_dict["Categories"] and temp_dict not in trashboxes: + trashboxes.append(temp_dict) + uniq_trashboxes = [ast.literal_eval(el1) for el1 in set([str(el2) for el2 in trashboxes])] + return JSONResponse(uniq_trashboxes) @app.get("/{rest_of_path:path}") diff --git a/front/src/api/trashbox/index.ts b/front/src/api/trashbox/index.ts index 7e45fa5..fb51234 100644 --- a/front/src/api/trashbox/index.ts +++ b/front/src/api/trashbox/index.ts @@ -6,9 +6,9 @@ import { Category } from '../../assets/category' const composeTrashboxURL = (position: LatLng, category: Category) => ( API_URL + '/trashbox?' + new URLSearchParams({ - lat: position.lat.toString(), - lng: position.lng.toString(), - category: category, + Lat: position.lat.toString(), + Lng: position.lng.toString(), + Category: category, }).toString() ) diff --git a/front/src/components/LineDot.tsx b/front/src/components/LineDot.tsx index 66b5ad7..dcb0778 100644 --- a/front/src/components/LineDot.tsx +++ b/front/src/components/LineDot.tsx @@ -3,7 +3,7 @@ import { colors, lineNames, lineByName } from '../assets/metro' function LineDot({ station }: { station: string }) { const line = lineByName(station) - if (line == undefined) { + if (line === undefined) { return <> } diff --git a/front/src/components/Poetry.tsx b/front/src/components/Poetry.tsx index 29659e5..10ea8db 100644 --- a/front/src/components/Poetry.tsx +++ b/front/src/components/Poetry.tsx @@ -26,7 +26,7 @@ function Poetry() { }} />

{poetry.data.author}

- Иллюстрация + Иллюстрация ) ) : ( diff --git a/front/src/hooks/api/useTrashboxes.ts b/front/src/hooks/api/useTrashboxes.ts index bd2929a..df88fc7 100644 --- a/front/src/hooks/api/useTrashboxes.ts +++ b/front/src/hooks/api/useTrashboxes.ts @@ -3,40 +3,20 @@ import { LatLng } from 'leaflet' import { Trashbox, isTrashboxResponse } from '../../api/trashbox/types' import useFetch, { UseFetchReturn } from '../useFetch' -import { faker } from '@faker-js/faker/locale/ru' import { Category } from '../../assets/category' -import { useMemo } from 'react' import { composeTrashboxURL, processTrashbox } from '../../api/trashbox' -function genMockTrashbox(pos: LatLng): Trashbox { - const loc = faker.location.nearbyGPSCoordinate({ origin: [pos.lat, pos.lng], radius: 1 }) - - return { - Name: faker.company.name(), - Address: faker.location.streetAddress(), - Categories: faker.lorem.words({ max: 3, min: 1 }).split(' '), - Lat: loc[0], - Lng: loc[1], - } -} - const useTrashboxes = (position: LatLng, category: Category): UseFetchReturn => ( // TODO: Remove once available // eslint-disable-next-line react-hooks/rules-of-hooks - import.meta.env.PROD ? useFetch( + useFetch( composeTrashboxURL(position, category), 'GET', true, isTrashboxResponse, processTrashbox, [], - ) : { - // eslint-disable-next-line react-hooks/rules-of-hooks - data: useMemo(() => new Array(3).fill(3).map(() => genMockTrashbox(position)), [position]), - loading: false, - error: null, - refetch: () => { return }, - } + ) ) export default useTrashboxes