Role są zbudowane w hierarchii odwróconej piramidy.
1.
ADMIN
2.
MOD
3.
GUEST
4.
USER
localhost:8080
localhost:8080/swagger-ui/index.html
W przypadku, gdy osoba została uwierzytelniona i ma już token JWT w cookies podczas
wysyłania zapytania na endpoint, który jest jej umożliwiony dzięki roli na
serwerze token ten jest walidowany przez JwtAuthenticationFilter gdzie jest
implementacja walidatora udostępniona przez pakiet io.jsonwebtoken. Filtr jest wywoływany
przy każdym zapytaniu do API.
Jeżeli użytkownik wyśle zapytanie na endpoint do którego nie ma dostępu otrzymuje Status code 401
GET /all
Status code: 400
Return: List of MassageDTO
Atrybuty MassageDTO:
public class MassageDTO {
private Integer id;
private String massageName;
private String description;
private String appointmentType;
}
Przykładowy JSON
[{
"id": 1,
"massageName": "Relaksacyjny Masaz",
"description": "Masaz dla relaksu",
"appointmentType": "RELAKSACYJNY"
},
{
"id": 2,
"massageName": "Terapeutyczny Masaz",
"description": "Masaz terapeutyczny",
"appointmentType": "TERAPEUTYCZNY"
},
{
"id": 3,
"massageName": "Masaz Glowy",
"description": "Masaz dla glowy",
"appointmentType": "GŁOWY"}
]
POST /register
public class UsersDTO {
private String email;
private String username;
private String surname;
private String password;
private String phone;
private boolean enabled;
Warunki:
email min. 5 znaków
username 3<=length<=25
surname 3<=length<=25
password 8<=length<=31
email - format emailu *@*.*
password - hasło zawierające przynajmniej jedną dużą literę. Dozwolone są znaki specjalne oraz cyfry. Bez białych znaków. Hasło jest hashowane za pomocą BCrypt
Status code: 200
Return: info
{
"info": "Zarejestrowano"
}
Status code 400
return: info
W przypadku niepoprawnych danych użytkownik nie jest uwierzytelniany.
{
"info": "Użytkownik o takim emailu jest już w bazie"
}
POST /login
public class UserCredentialsDTO {
private String email;
private String password;
}
Warunki:
email min. 5 znaków
password 8<=length<=31
Status code 200
return: token
{
"token": "eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJTYW1wbGV1c2VyIiwicm9sZSI6Ik1PRCIsImVtYWlsIjoibWF0aUB6YWsucGwiLCJpZCI6NCwidXNlcm5hbWUiOiJTYW1wbGV1c2VyIiwiaWF0IjoxNjk4Njk0MzMwLCJleHAiOjE2OTkwNTQzMzB9.5WNAkGC8ZAZHpdah5Dwiuu68ikkIfOO7AvaBB6Xkrd4"
}
Status code 400
return: info
{
"info": "Wprowadzono nieprawidłowe haslo"
}
GET /{date}
format daty: YYYY-MM-DD
Status code: 200
return: List<CalendarDTO>
public class CalendarDTO {
private LocalDate localDate;
private List<UsersDTO> usersDTOList;
}
public class UsersDTO {
private Integer id;
private String email;
private String username;
private String surname;
private String password;
private LocalTime localTime;
private MassageDTO massageDTO;
private String phone;
}
public class MassageDTO {
private Integer id;
private String massageName;
private String description;
@Enumerated(EnumType.STRING)
private EAppointmentType appointmentType;
}
Request zwraca wszystkie umówione wizyty z zakresu date - date + 7 dni. JSON zwraca posortowany wg. date ASC
Przykładowy JSON
[{
"localDate": "2023-10-16",
"usersDTOList": [
{
"id": 1,
"email": "jan.kowalski@example.com",
"username": "Jan",
"surname": "Kowalski",
"password": "password1",
"localTime": "10:00:00",
"massageDTO": {
"id": 2,
"massageName": "Terapeutyczny Masaz",
"description": "Masaz terapeutyczny",
"appointmentType": "TERAPEUTYCZNY"
}
}
]
},
{
"localDate": "2023-10-17",
"usersDTOList": [
{
"id": 2,
"email": "anna.nowak@example.com",
"username": "Anna",
"surname": "Nowak",
"password": "password2",
"localTime": "10:00:00",
"massageDTO": {
"id": 1,
"massageName": "Relaksacyjny Masaz",
"description": "Masaz dla relaksu",
"appointmentType": "RELAKSACYJNY"
}
}
]
}]
public class AppointmentDTO {
private Integer id;
private LocalDateTime startDate;
private LocalDateTime endDate;
private Integer userId;
private Integer massageId;
private String status;
}
public class AppointmentWithEmailDTO {
private Integer id;
private LocalDateTime startDate;
private LocalDateTime endDate;
private Integer userId;
private Integer massageId;
private String status;
private String userEmail;
private String userPhone;
}
public enum EAppointmentStatus {
FREE, BOOKED, FINISHED
}
GET /guest/appointment/{appointmentId}
GET /guest/appointment/all/free - bierze wszystkie Appointment ze statusem FREE, zwraca:
public class AppointmentResponseDTO {
private LocalDateTime localDate;
private List<SimpleAppointmentDTO> simpleAppointmentDTO;
}
gdzie:
public class SimpleAppointmentDTO {
private Integer id;
private LocalDateTime startDate;
private LocalDateTime endDate;
}
PUT /guest/appointment/{appointmentId}/book - zmienia status Appointment na BOOKED (dla zalogowanego uytkownika)
Przyjmuję AppointmentDTO
PUT /guest/appointment/{appointmentId}/book/guest - zmienia status Appointment na BOOKED (dla uytkowników nie zalogowanych)
Przyjmuję AppointmentWithEmailDTO
PUT /guest/appointment/{appointmentId}/cancel - zmienia status Appointment na FREE
public class AppointmentDTO {
private Integer id;
private LocalDateTime startDate;
private LocalDateTime endDate;
private Integer userId;
private Integer massageId;
private String status;
}
GET /guest/offer/{offerId}
GET /guest/offer/all
public class OfferPhotoDTO {
private Integer id;
private String photoName;
private byte[] photoByte;
private String photoType;
private Integer offerId;
}
POST /guest/offer-photo
GET /guest/offer-photo/{offerPhotoId}
PUT /guest/offer-photo/{offerPhotoId}
DELETE /guest//offer-photo/{offerPhotoId}
public class StartEndDateDTO {
private String startDate;
private String endDate;
}
POST /mod/appointment - tworzenie Appointment
POST /mod/appointment/list - (Lista StartEndDateDTO jako request body) tworzenie listy Appointment
POST /mod/appointment/date - tworzenie Appointment za pomocą obiektu StartEndDateDTO
GET /mod/appointment/{appointmentId}
GET /mod/appointment/all/finished - zwraca wszystkie Appointment ze statusem FINISHED
PUT /mod/appointment/{appointmentId}
PUT /mod/appointment/{appointmentId}/finished - zmienia status Appointment na FINISHED
DELETE /mod/appointment/{appointmentId}
DELETE /mod/newsletter - przyjmuję NewsletterDTO
POST /mod/offer - tworzenie oferty (OfferDTO)
PUT /mod/offer/{offerId} - update oferty, przyjmuje id
DELETE /mod/offer/{offerId} - usuwanie ofert, przyjmuje id
GET /mod/statistics - przyjmuje Integer year, Integer month jako parametry, zwraca statystyki:
public class StatisticsDTO {
private Integer id;
private int numberOfAppointmentsAYear;
private int numberOfAppointmentsAMonth;
private List<NumberType> numberOfMassagesAYear;
private List<NumberType> numberOfMassagesAMonth;
private double yearIncome;
private double averageMonthIncome;
private String mostWantedMassageYear;
private String mostWantedMassageMonth;
private int yearNumber;
private int monthNumber;
}
public class NumberType {
private Integer id;
private int numberOf;
private String typeOf;
}
POST /confimration
public class Email {
private int visitId;
private String recipientEmail;
private LocalDateTime startTime;
private LocalDateTime endTime;
private String username;
private String eventName;
private String description;
private EEmailStatus emailStatus;
}
recipientEmail - email klienta
startTime - data i godzina rozpoczęcia wizyty
startTime - data i godzina zakonczenia wizyty
username - imie klienta
eventName - dany masaz
description - opis (domyślny bądź opcjonalny)
emailStatus - String z typem decyzji:
ACCEPTATION - wizyta została zaakceptowana i klient otrzymuje email z potwierdzeniem
CHANGE - wizyta została zmieniona i klient otrzymuje email z nowym terminem wizyty
REJECTION - odmowa wizyty, anulowanie jej wraz ze zmianą statusu w bazie, email do klienta z odmowa
BAN - odmowa wizyty, anulowanie jej wraz ze zmianą statusu w bazie, email do klienta z odmowa, zablokowanie
możliwości składania wizyt w systemie pod dany nr telefonu lub email. W przypadku złego emailStatus
aplikacja zwraca status code 401
Status code: 200
return:InfoDTO
{
"info": "Wykonano"
}
POST /guest/opinion
Opinie można dodawać raz na dobę w celu zapobiegania spamu
public class OpinionDTO {
private String username;
private String description;
private Integer rate;
}
username - nazwa użytkownika pod którą zostanie wyświetlona opinia
description - treść opinii
rate - ocena w skali 1-5
Status code: 200
return: InfoDTO
{
"info": "Dziękujemy za dodanie opinii"
}
Status code: 419
return: InfoDTO
{
"info": "Przepraszamy. Wystąpił błąd."
}
GET /guest/opinion/{page}
public class Opinion {
private Integer id;
private String username;
private String description;
private Integer rate;
private LocalDate localDate;
}
Status code: 200
return: Opinion
{
"content": [
{
"id": 19,
"username": "5455555555",
"description": "5ref",
"rate": 5,
"localDate": "2023-11-02"
},
{
"id": 18,
"username": "1111111",
"description": "asadsa",
"rate": 11,
"localDate": "2023-11-02"
},
{
"id": 17,
"username": "fdsfds",
"description": "fsad",
"rate": 4,
"localDate": "2023-11-02"
},
{
"id": 16,
"username": "jkbj",
"description": "fsa",
"rate": 3,
"localDate": "2023-11-02"
},
{
"id": 15,
"username": "alloha",
"description": "fassfa",
"rate": 2,
"localDate": "2023-11-02"
}
],
"pageable": {
"pageNumber": 1,
"pageSize": 5,
"sort": {
"empty": false,
"sorted": true,
"unsorted": false
},
"offset": 5,
"paged": true,
"unpaged": false
},
"last": false,
"totalPages": 5,
"totalElements": 24,
"first": false,
"numberOfElements": 5,
"size": 5,
"number": 1,
"sort": {
"empty": false,
"sorted": true,
"unsorted": false
},
"empty": false
}
DELETE /mod/opinion/{id}
Usuwa opinie z danym ID
Status code: 200
reuturn: InfoDTO
{
"info": "Usunięto opinie z ID: " <id>
}
POST /restartpassword/{email}
Proces weryfikacyjny czy user o takim emailu istnieje i nie ma roli GUEST. Jeżeli user istnieje
jest tworzony obiekt RegisterPassword w celu zapisania nowego żądania resetu hasła. Do USERa jest wysyłane unikalny
link ze zmienną uuid
public class RestartPassword {
private Integer id;
private String uuid;
private Integer usersId;
private LocalDateTime startLocalDateTime;
private LocalDateTime endLocalDateTime;
}
id - id RestartPassword
uuid - uniwersalny klucz
usersId - id usera otrzymany za pomoca emailu
startLocalDateTime - czas i data utworzenia żądania
endLocalDateTime - startLocalDateTime + 15 min
Status code: 200
return: InfoDTO
{
"info": "W celu zresetowania swojego hasla sprawdz email"
}
Status code: 400
return: InfoDTO
{
"info": "Nie odnaleziono osoby o takim emailu"
}
GET /restartpassword/{uuid}
User wchodzi pod url, który otrzymał w emailu ze zmienną UUID, który został wygenerowany przy POST.
Przy GET uuid jest weryfikowane. Jeżeli żądanie zostanie zautoryzowane uuid zostaje zwracany na front dla PUT
Status code: 200
return: InfoDTO
{
"info": "ea83ee37-f521-4ac0-9299-ebaab1d74c3a"
}
Status code: 400
return: InfoDTO
{
"info": "Wystąpił błąd z uuid"
}
PUT /restartpassword
Otrzymuje obiekt RestartPasswordDTO, który jest ostatecznie walidowany oraz odpowiada za aktualizacje hasła
dla USERa
public class RestartPasswordDTO {
private String uuid;
private String password;
}
uuid - uuid, które zostało zwrócone przy żądaniu GET
password - hasło, które ma 8-31 znaków bez białych znaków
Status code: 200
return: InfoDTO
{
"info": "Zmieniono haslo"
}
Status code: 400
return: InfoDTO
{
"info": "Wystąpił błąd z uuid"
}
public class NewsletterDTO {
private Integer id;
private String userEmail;
private UUID deleteKey;
}
POST /guest/newsletter - przyjmuję NewsletterDTO(w zasadzie sam email), wysyła email przy zapisie Sprawdza czy user jest juz zapisany do newslettera
Przykładowy Json:
{
"userEmail": "user@gmail.com"
}
Status code: 200
return: InfoDTO
{
"info": "Dodano do newslettera!"
}
Status code: 400
return: InfoDTO
{
"info": "Użytkownik jest już zapisany do newslettera!"
}
DELETE /guest/{deleteKey} - usuwanie poprzez kliknięcie w link w emailu