Напишете клиент-сървър приложение с функционалност, наподобяваща тази на Todoist.
Todoist e task manager или, иначе казано, приложение, което менажира to-do-list задачки. То цели улесняването на създаване, организиране и проследяване на прогреса на прости задачи от всекидневието или на големи проекти. Задачите може да са всекидневни: "да купя вечеря"; "да нахраня кучето", до цял проект, който да проследи създаването на дипломна работа.
Създайте клиентско конзолно приложение, което приема потребителски команди, изпраща ги за обработка на сървъра, приема отговора му и го предоставя на потребителя в human-readable формат.
Note: Командите и output-ът в условието са примерни, свободни сте да ги преименувате и форматирате. Единственото условие е, те да бъдат интуитивни. За улеснение на потребителя, може да имплементирате команда help.
Една задача се състои от следните атрибути:
- name - име на задачата
- date (optional) - дата, на която искаме да изпълним задачата
- due date (optional) - дата, до която със сигурност трябва да изпълним задачата
- description (optional) - описание на задачата
Note: Приемаме, че една задача се характеризира от името си и датата, ако има такава. Задачи без date отиват в така наречения Inbox - задачи, без фиксиран date. Следователно, в Inbox-а не можем да имаме повече от една задача с едно и също име. За конкретен ден, също не можем да имаме повече от една задача с едно и също име. При изпълнението на командите, ако не укажем параметъра за дата, приемаме, че задачата се очаква да бъде в Inbox-a.
-
register - регистрация на потребител с username и password. Регистрираните потребители се пазят във файл на сървъра - той служи като база от данни. При спиране и повторно пускане, сървърът може да зареди в паметта си вече регистрираните потребители.
-
login - потребителят влиза в системата
-
add-task - добавяне на нова задача. Ако задачата няма --date, тя бива добавена директно в Inbox-а.
$ add-task --name=<name> --date=<date> --due-date=<due-date> --description=<description>
-
update-task - промяна на някой от атрибутите на задача. Единственият атрибут, който не можем да променяме, е името.
$ update-task --name=<name> --date=<date> --due-date=<due-date> --description=<description>
-
delete-task - изтриване на задача.
$ delete-task --name=<task_name> $ delete-task --name=<task_name> --date=<date>
-
get-task - предоставя информацията за дадена задача в human-readable формат.
$ get-task --name=<task_name> $ get-task --name=<task_name> --date=<date>
-
list-tasks - предоставя информацията за всички задачи от конкретен ден или от Inbox-a. Командата приема и опционален флаг completed и може да изведе и информация за всички вече завършени задачи.
$ list-tasks $ list-tasks --completed=true $ list-tasks --date=<date>
-
list-dashboard - предоставя информацията за всички задачи от днешния ден.
$ list-dashboard
-
finish-task - маркира конкретната задача като завършена.
$ finish-task --name=<name>
Колаборация (или collaboration) представлява споделен проект, в който могат да се добавят задачи, които са видими за всички участници в него. Задачите в колаборацията имат още един опционален атрибут - assignee, т.е. потребителят, който ще работи по задачата.
- add-collaboration - добавя нова колаборация.
$ add-collaboration --name=<name>
- delete-collaboration - изтрива колаборация. Една колаборация може да бъде изтрита само от потребителя, който я е създал. Изтриването на колаборацията автоматично трябва да изтрие и всички задачи, които са част от нея.
$ delete-collaboration --name=<name>
- list-collaborations - предоставя информацията всички колаборации на съответния потребител. Това включва такива, които той е създал и такива към които е добавен.
$ list-collaborations
- add-user - добавя потребител към колаборацията.
$ add-user --collaboration=<name> --user=<username>
- assign-task - задава assignee за дадена задача в колаборацията.
$ assign-task --collaboration=<name> --user=<username> --task=<name>
- list-tasks --collaboration - предоставя информацията за всички задачи от колаборацията.
$ list-tasks --collaboration=<name>
- list-users --collaboration - извежда всички потребители, които са част от колаборацията.
$ list-users --collaboration=<name>
Етикетите (или labels) представляват споделен лесен начин, по който можем да групираме няколко задачи. Ако например имаме няколко различни задачи, свързани с университета, можем да им сложим етикет university.
- add-label - добавя нов етикет, който е видим само в акаунта на потребителя, който изпълнява командата.
$ add-label --name=<name>
- delete-label - изтриване на етикет.
$ delete-label --name=<name>
- list-labels - предоставя информация за всички етикети, които потребителят е създал.
$ list-labels
- label-task - добавя етикет на дадена задача.
$ label-task --name=<name> --date=<date> --label=<name>
- list-tasks --label - предоставя информацията за всички задачи, на които е поставен даденият етикет.
$ list-tasks --label=<name>
- Сървърът може да обслужва множество потребители паралелно.
- Сървърът пази информацията за потребители, задачи, колаборации по такъв начин, който му позволява след спиране или рестартиране да може да зареди тази информация отново. Помислете за подходящ формат на данни, в който може да съхранявате информацията от сървъра.