ULKYPF5G2QVSDEXY23FLBHEDYLO7MOSK4TAMDA75DWXWIJFCEV6AC MAYEIQ2E4WSXRYVPYT65UIEJGVXFUHHQJ3AYLO55ZINUT63KRPYAC ITMEL5AKAAX6JCXHUZ4JB6D2KFTB3YQTTCR5C673A22OBNZHNJBQC O2Z6RAAYF4PDZNZXGYCI4B566NTSCVHFYTR46CFDGGI3KNFW76EAC GIKW7G7ZCEUPTGDPUV236VJCPM7UGNKI6LI2T5KMIUWVNB4PICQQC KOPR5C5RMNSRY5MRNOZ5XB7QNCN7XVCGMQG2I7HKIQAFASNJJXAAC VWSECUK44FH5GMLGZV4OQJWD4VGQOSLDNMGLMQPUP2QQWU5VKMUAC HLT3VOJGKJBMLCM2J65FGAEWDSWRRCGMBGZBHC4UXHENDPXQGOQQC TUSMTGTTQROHH4V5VQNEPNRSCFXZMUK4FN3OIDGM7LPPVQ6SWZKAC YQVP6FAHRKWOOBA2O35CZJFOUZGPWOVOSA4XDAZSGS25J34W6EEQC L3L2ES3MCB63PC2N2AWUIRKQA53C43IXGMBTT5GCDHLY2IU7SE3QC WHFVDGU5M2K6UF3RTXTBR4UHJSRCXRSLF6CMIFNEAIUPH2KS6E5AC R2VVWPT45ZOZW7MQ4EWJWJHNBLVUVQDKPYYHGAFZCKJEJ5MXY4VQC NZPSP4FWVNXVB47CVYEPFUDGGJ3YH5JAYKILGOJI5PIQ2EL6ZYCQC R6WKWABEMZLMEX7IBIJNDAQSQGTQ72QX4QHWUGTQAOFCL73PQZNQC 6XRNELJYSCXSUKCASHOV5KI5J7J37L6ZRQLF53XNYFFB5LQSV5SQC EENZ7HLU65AN4LHPLQNAFIZ37IFO6BC7G4R4PJEYXATK5BOJD42AC PWLSQM2M5J3KLR6HYCQAMBC6VB2MBT6QZNG5ILNK63PEWTC4FK7QC VRJ6XA2ZRV5MP6UVYCFFWOVHXFFVOMNXZP4LZ5EYYPYKSDHJYCGAC TNXTGRS57XF7ORZZDGE265QTQFEKSPEOYA3OLC4SJDFHELE6KD4QC BIILSRZG4Y3K4DTEBPOQD4EERVJ5DUL3LU42XKJAKWKDN7DVTWXAC YQ4KLIM4WBKSSO32V7GOU6IVY53XAHIPL65RUUKWNKILOZ7VLQSAC UILSLVIAB4X2JHH57MLWDO4BFD665BPR2ISHEX35VFMVGP7QPGYAC 4X7O3IIIOLNFM7WIRFIQSA57Z5WBNN4ALXHLVEX6X5VAFH3NRYQAC UGT3GABDAFKEMPYA2G2ATTGHAITHWLOMCVSI5NLGXZNZ7BDFKONQC from beats.db_helpers import serialize_from_document, serialize_to_documentfrom beats.exceptions import ProjectWasNotStarted, TwoProjectInProgess, NoObjectMatchedfrom beats.domain import ProjectRepository, Project, Beat, BeatRepository
@app.get("/projects")async def list_projects(archived: bool = False):data = [serialize_from_document(p) for p in ProjectRepository.list({"archived": archived})]return data@app.post("/projects", status_code=http.HTTPStatus.CREATED)async def create_project(project: Project):project = ProjectRepository.create(project.dict(exclude_none=True))return serialize_from_document(project)@app.put("/projects")async def update_project(project: Project):project = ProjectRepository.update(serialize_to_document(project.dict(exclude_none=True)))return serialize_from_document(project)@app.post("/projects/{project_id}/archive")async def archive_project(project_id: str):ProjectRepository.update({'_id': project_id, 'archived': True})return {"status": "success"}@app.get("/projects/{project_id}/today/")async def today_time_for_project(project_id: str):logs = list(BeatRepository.list({"project_id": project_id}))today_logs = [Beat(**serialize_from_document(log)) for log in logs if Beat(**log).start.date() == date.today()]return {"duration": str(sum([log.duration for log in today_logs], timedelta()))}
@app.get("/projects/{project_id}/summary/")async def get_project_summary(project_id: str):logs = list(BeatRepository.list({"project_id": project_id}))logs = [Beat(**serialize_from_document(log)) for log in logs]statistical = {}for log in logs:if not statistical.get(log.day):statistical[log.day] = []statistical[log.day].append(log.duration)statistical = {key: str(sum(value)) for key, value in statistical}return statistical@app.post("/projects/{project_id}/start")async def start_project_timer(project_id: str, time_validator: RecordTimeValidator):available_project_ids = [str(p["_id"]) for p in ProjectRepository.list()]if project_id not in available_project_ids:return {"project_id": "This project id does not exist"}logs = list(BeatRepository.list({"project_id": project_id, "end": None}))if logs:log = logs[0]log = Beat(**serialize_from_document(log))return JSONResponse(content={"error": "another beat already in progress", "beat": log.json(exclude_none=True)},status_code=status.HTTP_400_BAD_REQUEST)# raise ProjectAlreadyStartedlog = Beat(project_id=project_id, start=time_validator.time)log = Beat(**serialize_from_document(BeatRepository.create(log.dict(exclude_none=True))))return log@app.post("/projects/stop")async def end_project_timer(time_validator: RecordTimeValidator):logs = list(BeatRepository.list({"end": None}))if not logs:raise ProjectWasNotStartedif len(logs) > 1:raise TwoProjectInProgesslog = serialize_from_document(logs[0])logger.info(f"We got log {log}")log = Beat(**log)logger.info(f"Validated log: {log.dict()}")log.stop_timer(time=time_validator.time)BeatRepository.update(serialize_to_document(log.dict()))return log@app.get("/beats")async def list_beats(project_id: Optional[str] = None, date: Optional[date] = None):filters = {}if project_id:filters.update({"project_id": project_id})if date:filters.update({"date": date})logs = list(BeatRepository.list(filters))return [serialize_from_document(log) for log in logs]@app.post("/beats", status_code=http.HTTPStatus.CREATED)async def create_beat(log: Beat):log = BeatRepository.create(log.dict(exclude_none=True))return serialize_from_document(log)@app.get("/beats/{beat_id}")async def get_beat(beat_id: str):beat = BeatRepository.retrieve_by_id(beat_id)return serialize_from_document(beat)@app.put("/beats")async def update_beat(log: Beat):log = BeatRepository.update(serialize_to_document(log.dict()))return serialize_from_document(log)@app.get("/heart/sounds")async def heart_status():try:last_beat = Beat(**serialize_from_document(BeatRepository.get_last()))except NoObjectMatched:return {"isBeating": False,"project": None,}if last_beat.is_beating():return {"isBeating": True,"project": last_beat.project_id,"since": last_beat.start,"so_far": last_beat.duration}else:return {"isBeating": False,"lastBeatOn": last_beat.project_id,"for": last_beat.duration}
from fastapi import APIRouterfrom beats.db_helpers import serialize_from_documentfrom beats.domain import Beat, BeatRepositoryfrom beats.exceptions import NoObjectMatchedrouter = APIRouter(prefix="/api/timer", tags=["Timer"],responses={404: {"description": "Not found"}},)@router.get("/status")async def heart_status():try:last_beat = Beat(**serialize_from_document(BeatRepository.get_last()))except NoObjectMatched:return {"isBeating": False,"project": None,}if last_beat.is_beating():return {"isBeating": True,"project": last_beat.project_id,"since": last_beat.start,"so_far": last_beat.duration}else:return {"isBeating": False,"lastBeatOn": last_beat.project_id,"for": last_beat.duration}
import httpimport loggingfrom datetime import date, timedeltafrom fastapi import APIRouterfrom starlette import statusfrom starlette.responses import JSONResponsefrom beats.db_helpers import serialize_from_document, serialize_to_documentfrom beats.domain import ProjectRepository, Project, BeatRepository, Beatfrom beats.exceptions import ProjectWasNotStarted, TwoProjectInProgessfrom beats.validation_models import RecordTimeValidatorlogger = logging.getLogger(__name__)router = APIRouter(prefix="/api/projects", tags=["Projects"],responses={404: {"description": "Not found"}},)@router.get("/")async def list_projects(archived: bool = False):data = [serialize_from_document(p) for p in ProjectRepository.list({"archived": archived})]return data@router.post("/", status_code=http.HTTPStatus.CREATED)async def create_project(project: Project):project = ProjectRepository.create(project.dict(exclude_none=True))return serialize_from_document(project)@router.put("/")async def update_project(project: Project):project = ProjectRepository.update(serialize_to_document(project.dict(exclude_none=True)))return serialize_from_document(project)@router.post("/{project_id}/archive")async def archive_project(project_id: str):ProjectRepository.update({'_id': project_id, 'archived': True})return {"status": "success"}@router.get("/{project_id}/today/")async def today_time_for_project(project_id: str):logs = list(BeatRepository.list({"project_id": project_id}))today_logs = [Beat(**serialize_from_document(log)) for log in logs if Beat(**log).start.date() == date.today()]return {"duration": str(sum([log.duration for log in today_logs], timedelta()))}@router.get("/{project_id}/summary/")async def get_project_summary(project_id: str):logs = list(BeatRepository.list({"project_id": project_id}))logs = [Beat(**serialize_from_document(log)) for log in logs]statistical = {}for log in logs:if not statistical.get(log.day):statistical[log.day] = []statistical[log.day].append(log.duration)statistical = {key: str(sum(value)) for key, value in statistical}return statistical@router.post("/{project_id}/start")async def start_project_timer(project_id: str, time_validator: RecordTimeValidator):available_project_ids = [str(p["_id"]) for p in ProjectRepository.list()]if project_id not in available_project_ids:return {"project_id": "This project id does not exist"}logs = list(BeatRepository.list({"project_id": project_id, "end": None}))if logs:log = logs[0]log = Beat(**serialize_from_document(log))return JSONResponse(content={"error": "another beat already in progress", "beat": log.json(exclude_none=True)},status_code=status.HTTP_400_BAD_REQUEST)# raise ProjectAlreadyStartedlog = Beat(project_id=project_id, start=time_validator.time)log = Beat(**serialize_from_document(BeatRepository.create(log.dict(exclude_none=True))))return log@router.post("/stop")async def end_project_timer(time_validator: RecordTimeValidator):logs = list(BeatRepository.list({"end": None}))if not logs:raise ProjectWasNotStartedif len(logs) > 1:raise TwoProjectInProgesslog = serialize_from_document(logs[0])logger.info(f"We got log {log}")log = Beat(**log)logger.info(f"Validated log: {log.dict()}")log.stop_timer(time=time_validator.time)BeatRepository.update(serialize_to_document(log.dict()))return log
import httpfrom datetime import datefrom typing import Optionalfrom fastapi import APIRouterfrom beats.db_helpers import serialize_from_document, serialize_to_documentfrom beats.domain import Beat, BeatRepositoryrouter = APIRouter(prefix="/api/beats", tags=["Beats"],responses={404: {"description": "Not found"}},)@router.post("/", status_code=http.HTTPStatus.CREATED)async def create_beat(log: Beat):log = BeatRepository.create(log.dict(exclude_none=True))return serialize_from_document(log)@router.get("/")async def list_beats(project_id: Optional[str] = None, date: Optional[date] = None):filters = {}if project_id:filters.update({"project_id": project_id})if date:filters.update({"date": date})logs = list(BeatRepository.list(filters))return [serialize_from_document(log) for log in logs]@router.get("/{beat_id}")async def get_beat(beat_id: str):beat = BeatRepository.retrieve_by_id(beat_id)return serialize_from_document(beat)@router.put("/")async def update_beat(log: Beat):log = BeatRepository.update(serialize_to_document(log.dict()))return serialize_from_document(log)