Създайте Spring boot приложение за управление на задачи (task-manager).

За всяка задача се съхранява следната информация:

  • пореден номер на задачата (id);
  • кратко описание (summary);
  • описание (description);
  • краен срок (deadline);
  • отчети (reports).

По отношение на една задача могат да бъдат изпратени много отчети за изпълнение.

За всеки отчет да се съхранява следната информация:

  • пореден номер на отчета (id);
  • текстово описание на отчета (content);
  • отработено време (workTime);
  • дата и час на създаване (dateCreated);
  • дата и час на актуализиране (dateUpdated).

Приложението трябва да изпълнява функционалности за:

Задачи:

  • преглед на всички добавени задачи;
  • добавяне на задача;
  • преглед на дадена задача по зададен номер;
  • актуализация на задача по зададени номер и актуални данни;
  • изтриване на задача по зададен номер.

Отчет:

  • добавяне на отчет към дадена задача;
  • преглед на всички отчети към дадена задача;
  • преглед на отчет към дадена задача;
  • актуализация на отчет към дадена задача;
  • изтриване на отчет към дадена задача.
  • извеждане на отчети по дадена задача с брой отработени часове в даден интервал;
  • извеждане на отчета по дадена задача с най-голям брой отработени часове;
  • изчисляване на отработените часове за изпълнение на задача по подаден номер.

Приложението трябва да има слой за обработка на бизнес процесите Servise и слой за CRUD операции в хранилище на данни.

Слоевете трябва да си комуникират с DTO обекти. Данните в приложението трябва да се проверяват за валидни стойности.

  • Заглавието не трябва да е празно;
  • Описанието трябва да е поне 10 символа;
  • Крайният срок не трябва да бъде null.

Приложението трябва да има глобално обработване на грешки с GlobalExceptionHandler. В GlobalExceptionHandler осигурете подходящ отговор към клиента при некоректно подадени данни.

CRUD операциите да се реализират с JpaRepository и Hibernate ORM. За база данни да се използва PostgreSQL.

Приложението трябва да поддържа:

Функционалности за регистрация и вписване на потребители в приложението за управление на задачи. Следвайте следните стъпки:

1.Създайте следните entity класове:

  • User – id, име, потребителско име, парола, електронна поща;
  • Role – id, наименование.

2.Задайте с анотации връзка между двете същности много към много (М:М). Създайте таблиците като стартирате приложението.

3.Добавете два repository слоя за управление на потребителите и ролите. Добавете методи за намиране на потребител по потребителско име (както и булев метод, който да установява дали подобно съществува) и за намиране на роля по име.

4.Създайте клас, имплементиращ интерфейса UserDetailsService. Имплементирайте метода loadUserByUsername(String username), като нека той да връща UserDetails обект, съдържащ данните на потребителя и неговите роли.

5.Създайте конфигурационен клас (с анотации @Configuration, @EnableWebSecurity и @EnableMethodSecurity), който да инжектира имплементацията на UserDetailsService и да конфигурира AuthenticationManager и PasswordEncoder. Да включва SecurityFilterChain метод, който да задава свободен достъп до ресурсите, свързани с регистрация, вписване и изход, както и изискване за удостоверяване при всички останали.

6.Приложението трябва да се защити с JWT. Направете така, че задачите да могат да се добавят, редактират и изтриват единствено от потребители с роля на администратор.

7.Добавете сервизен слой, контролер и нужните DTO за реализация на логиката по регистрация, вписване и изход.