From 4dd2794b35f7b84f4c7ba48164609adf53b64ec0 Mon Sep 17 00:00:00 2001 From: Andrey Date: Wed, 19 Feb 2025 12:02:56 +0300 Subject: [PATCH] Added enties, dtos and something like it(with //) --- .../ru/myitschool/work/api/ControllerAPI.java | 108 ---------- .../work/api/HandlersResultAPI.java | 9 - .../ru/myitschool/work/api/RequestsAPI.java | 23 --- .../work/api/data/CredentialsDataSource.java | 36 ++++ .../work/api/data/EmployeeRepositoryImpl.java | 121 ++++++++++++ .../work/api/data/OfficeRepositoryImpl.java | 94 +++++++++ .../work/api/data/SignRepositoryImpl.java | 111 +++++++++++ .../work/api/data/VisitRepositoryImpl.java | 99 ++++++++++ .../work/api/data/dto/OfficeDTO.java | 47 +++++ .../work/api/data/dto/PositionDTO.java | 23 +++ .../work/api/data/dto/TerminalDTO.java | 26 +++ .../work/api/data/dto/VisitDTO.java | 38 ++++ .../data/dto/employee/EmployeeCreateDTO.java | 35 ++++ .../api/data/dto/employee/EmployeeDTO.java | 79 ++++++++ .../data/dto/employee/EmployeeItemDTO.java | 34 ++++ .../api/data/network/RetrofitFactory.java | 58 ++++++ .../work/api/data/source/EmployeeApi.java | 35 ++++ .../work/api/data/source/OfficeApi.java | 33 ++++ .../work/api/data/source/SignApi.java | 18 ++ .../work/api/data/source/VisitApi.java | 29 +++ .../work/api/data/utils/CallToConsumer.java | 40 ++++ .../work/api/domain/EmployeeRepository.java | 21 ++ .../work/api/domain/OfficeRepository.java | 13 ++ .../work/api/domain/SignRepository.java | 15 ++ .../work/api/domain/VisitRepository.java | 17 ++ .../work/api/domain/entity/Status.java | 30 +++ .../entity/employee/EmpolyeeEntity.java | 152 +++++++++++++++ .../entity/employee/ItemEmployeeEntity.java | 66 +++++++ .../domain/entity/office/OfficeEntity.java | 88 +++++++++ .../api/domain/entity/visit/VisitEntity.java | 57 ++++++ .../employee/DeleteEmployeeUseCase.java | 22 +++ .../useCases/employee/GetAllEmployees.java | 22 +++ .../employee/GetEmloyeeByIdUseCase.java | 23 +++ .../employee/GetEmployeeByEmailUseCase.java | 20 ++ .../employee/PatchEmployeeOfficeId.java | 20 ++ .../employee/UpdateEmployeeUseCase.java | 21 ++ .../useCases/office/GetAllOficiesUseCase.java | 22 +++ .../useCases/sign/CreateEmployeeUseCase.java | 22 +++ .../useCases/sign/LoginEmployeeUseCase.java | 24 +++ .../ru/myitschool/work/api/entity/Code.java | 14 -- .../myitschool/work/api/entity/Employee.java | 87 --------- .../myitschool/work/core/BundleConstants.kt | 7 + .../java/ru/myitschool/work/core/Constants.kt | 6 - .../ru/myitschool/work/core/MyConstants.kt | 7 - .../ru/myitschool/work/core/RoleConstants.kt | 7 + .../myitschool/work/core/SettingConstants.kt | 10 + .../ru/myitschool/work/core/UrlConstants.kt | 7 + .../ru/myitschool/work/ui/RootActivity.kt | 66 ------- .../work/ui/login/LoginDestination.kt | 6 - .../myitschool/work/ui/login/LoginFragment.kt | 122 ------------ .../work/ui/login/LoginViewModel.kt | 17 -- .../ui/login/UsernameEditTextListener.java | 24 --- .../work/ui/main/MainDestination.kt | 6 - .../myitschool/work/ui/main/MainFragment.kt | 184 ------------------ .../work/ui/result/ResultDestination.kt | 6 - .../work/ui/result/ResultFragment.kt | 75 ------- .../myitschool/work/utils/DownloadImage.java | 37 ---- app/src/main/res/layout/bdgh.xml | 18 ++ app/src/main/res/layout/item_user_list.xml | 6 + 59 files changed, 1666 insertions(+), 797 deletions(-) delete mode 100644 app/src/main/java/ru/myitschool/work/api/ControllerAPI.java delete mode 100644 app/src/main/java/ru/myitschool/work/api/HandlersResultAPI.java delete mode 100644 app/src/main/java/ru/myitschool/work/api/RequestsAPI.java create mode 100644 app/src/main/java/ru/myitschool/work/api/data/CredentialsDataSource.java create mode 100644 app/src/main/java/ru/myitschool/work/api/data/EmployeeRepositoryImpl.java create mode 100644 app/src/main/java/ru/myitschool/work/api/data/OfficeRepositoryImpl.java create mode 100644 app/src/main/java/ru/myitschool/work/api/data/SignRepositoryImpl.java create mode 100644 app/src/main/java/ru/myitschool/work/api/data/VisitRepositoryImpl.java create mode 100644 app/src/main/java/ru/myitschool/work/api/data/dto/OfficeDTO.java create mode 100644 app/src/main/java/ru/myitschool/work/api/data/dto/PositionDTO.java create mode 100644 app/src/main/java/ru/myitschool/work/api/data/dto/TerminalDTO.java create mode 100644 app/src/main/java/ru/myitschool/work/api/data/dto/VisitDTO.java create mode 100644 app/src/main/java/ru/myitschool/work/api/data/dto/employee/EmployeeCreateDTO.java create mode 100644 app/src/main/java/ru/myitschool/work/api/data/dto/employee/EmployeeDTO.java create mode 100644 app/src/main/java/ru/myitschool/work/api/data/dto/employee/EmployeeItemDTO.java create mode 100644 app/src/main/java/ru/myitschool/work/api/data/network/RetrofitFactory.java create mode 100644 app/src/main/java/ru/myitschool/work/api/data/source/EmployeeApi.java create mode 100644 app/src/main/java/ru/myitschool/work/api/data/source/OfficeApi.java create mode 100644 app/src/main/java/ru/myitschool/work/api/data/source/SignApi.java create mode 100644 app/src/main/java/ru/myitschool/work/api/data/source/VisitApi.java create mode 100644 app/src/main/java/ru/myitschool/work/api/data/utils/CallToConsumer.java create mode 100644 app/src/main/java/ru/myitschool/work/api/domain/EmployeeRepository.java create mode 100644 app/src/main/java/ru/myitschool/work/api/domain/OfficeRepository.java create mode 100644 app/src/main/java/ru/myitschool/work/api/domain/SignRepository.java create mode 100644 app/src/main/java/ru/myitschool/work/api/domain/VisitRepository.java create mode 100644 app/src/main/java/ru/myitschool/work/api/domain/entity/Status.java create mode 100644 app/src/main/java/ru/myitschool/work/api/domain/entity/employee/EmpolyeeEntity.java create mode 100644 app/src/main/java/ru/myitschool/work/api/domain/entity/employee/ItemEmployeeEntity.java create mode 100644 app/src/main/java/ru/myitschool/work/api/domain/entity/office/OfficeEntity.java create mode 100644 app/src/main/java/ru/myitschool/work/api/domain/entity/visit/VisitEntity.java create mode 100644 app/src/main/java/ru/myitschool/work/api/domain/useCases/employee/DeleteEmployeeUseCase.java create mode 100644 app/src/main/java/ru/myitschool/work/api/domain/useCases/employee/GetAllEmployees.java create mode 100644 app/src/main/java/ru/myitschool/work/api/domain/useCases/employee/GetEmloyeeByIdUseCase.java create mode 100644 app/src/main/java/ru/myitschool/work/api/domain/useCases/employee/GetEmployeeByEmailUseCase.java create mode 100644 app/src/main/java/ru/myitschool/work/api/domain/useCases/employee/PatchEmployeeOfficeId.java create mode 100644 app/src/main/java/ru/myitschool/work/api/domain/useCases/employee/UpdateEmployeeUseCase.java create mode 100644 app/src/main/java/ru/myitschool/work/api/domain/useCases/office/GetAllOficiesUseCase.java create mode 100644 app/src/main/java/ru/myitschool/work/api/domain/useCases/sign/CreateEmployeeUseCase.java create mode 100644 app/src/main/java/ru/myitschool/work/api/domain/useCases/sign/LoginEmployeeUseCase.java delete mode 100644 app/src/main/java/ru/myitschool/work/api/entity/Code.java delete mode 100644 app/src/main/java/ru/myitschool/work/api/entity/Employee.java create mode 100644 app/src/main/java/ru/myitschool/work/core/BundleConstants.kt delete mode 100644 app/src/main/java/ru/myitschool/work/core/Constants.kt delete mode 100644 app/src/main/java/ru/myitschool/work/core/MyConstants.kt create mode 100644 app/src/main/java/ru/myitschool/work/core/RoleConstants.kt create mode 100644 app/src/main/java/ru/myitschool/work/core/SettingConstants.kt create mode 100644 app/src/main/java/ru/myitschool/work/core/UrlConstants.kt delete mode 100644 app/src/main/java/ru/myitschool/work/ui/RootActivity.kt delete mode 100644 app/src/main/java/ru/myitschool/work/ui/login/LoginDestination.kt delete mode 100644 app/src/main/java/ru/myitschool/work/ui/login/LoginFragment.kt delete mode 100644 app/src/main/java/ru/myitschool/work/ui/login/LoginViewModel.kt delete mode 100644 app/src/main/java/ru/myitschool/work/ui/login/UsernameEditTextListener.java delete mode 100644 app/src/main/java/ru/myitschool/work/ui/main/MainDestination.kt delete mode 100644 app/src/main/java/ru/myitschool/work/ui/main/MainFragment.kt delete mode 100644 app/src/main/java/ru/myitschool/work/ui/result/ResultDestination.kt delete mode 100644 app/src/main/java/ru/myitschool/work/ui/result/ResultFragment.kt delete mode 100644 app/src/main/java/ru/myitschool/work/utils/DownloadImage.java create mode 100644 app/src/main/res/layout/bdgh.xml create mode 100644 app/src/main/res/layout/item_user_list.xml diff --git a/app/src/main/java/ru/myitschool/work/api/ControllerAPI.java b/app/src/main/java/ru/myitschool/work/api/ControllerAPI.java deleted file mode 100644 index 4ec495d..0000000 --- a/app/src/main/java/ru/myitschool/work/api/ControllerAPI.java +++ /dev/null @@ -1,108 +0,0 @@ -package ru.myitschool.work.api; - -import android.util.Log; - -import androidx.annotation.NonNull; - -import java.io.IOException; -import java.util.Objects; - -import retrofit2.Call; -import retrofit2.Callback; -import retrofit2.Response; -import retrofit2.Retrofit; -import retrofit2.converter.gson.GsonConverterFactory; -import ru.myitschool.work.core.Constants; -import ru.myitschool.work.api.entity.Code; -import ru.myitschool.work.api.entity.Employee; - -public class ControllerAPI { - // Главный класс по работе с сервером. В качестве дженерик типа передаётся класс, в котором надо - // имплементировать HandlersResultAPI. Потом нужно прописать в полученных методах работу - // с результатами вызова API. И создав экземпляр этого класса вызвать нужный метод. - // - // Примерно так все должно выглядеть: - // - // public class LoginActivity ... implements HandlersResultAPI { - // private ControllerAPI controllerAPI; - // - // @Override - // protected void onCreate(Bundle savedInstanceState) { - // ... - // controllerAPI = new ControllerAPI(); - // ... - // controllerAPI.verificationLogin("Логин пользователя", LoginActivity.this); - // } - // - // @Override - // public void handlerVerificationLogin(boolean result) { - // // Тут работа с результатами controllerAPI.verificationLogin - // } - // - // @Override - // public void handlerGetEmployee(Employee employee) { } - // - // @Override - // public void handlerVisit(boolean result) { } - // } - // - // Всё это по факту один большой костыль, который придуман, чтобы обойти многопоточность. - - private final RequestsAPI managerAPI; - - public ControllerAPI() { - Retrofit retrofit = new Retrofit.Builder() - .baseUrl(Constants.SERVER_ADDRESS) - .addConverterFactory(GsonConverterFactory.create()) - .build(); - managerAPI = retrofit.create(RequestsAPI.class); - } - - public void verificationLogin(String login, T handler) { - managerAPI.verificationLogin(login).enqueue(new Callback<>() { - @Override - public void onResponse(@NonNull Call call, @NonNull Response response) { - Log.d("Test", "(Верификация логина) - Ответ от сервера: " + response.code()); - handler.handlerVerificationLogin(login, response.code() == 200); - } - - @Override - public void onFailure(@NonNull Call call, @NonNull Throwable t) { - Log.e("Test", "(Верификация логина) - " + Objects.requireNonNull(t.getMessage())); - handler.handlerVerificationLogin(login, false); - } - }); - } - - public void getEmployee(String login, T handler) { - managerAPI.getEmployee(login).enqueue(new Callback<>() { - @Override - public void onResponse(@NonNull Call call, @NonNull Response response) { - Log.d("Test", "(Получение пользователя) - Ответ от сервера: Тело - " + response.body() + " Код - " + response.code()); - handler.handlerGetEmployee(response.body()); - } - - @Override - public void onFailure(@NonNull Call call, @NonNull Throwable t) { - Log.e("Test", "(Получение пользователя) - " + Objects.requireNonNull(t.getMessage())); - handler.handlerGetEmployee(null); - } - }); - } - - public void visit(String login, Code code, T handler) throws IOException { - managerAPI.visit(login, code).enqueue(new Callback<>() { - @Override - public void onResponse(Call call, Response response) { - Log.d("Test", "(Проверка кода) - Ответ от сервера: Код - " + response.code()); - handler.handlerVisit(response.code()); - } - - @Override - public void onFailure(Call call, Throwable t) { - Log.e("Test", "(Получение пользователя) - " + Objects.requireNonNull(t.getMessage())); - handler.handlerVisit(400); - } - }); - } -} \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/api/HandlersResultAPI.java b/app/src/main/java/ru/myitschool/work/api/HandlersResultAPI.java deleted file mode 100644 index 1d1b3ad..0000000 --- a/app/src/main/java/ru/myitschool/work/api/HandlersResultAPI.java +++ /dev/null @@ -1,9 +0,0 @@ -package ru.myitschool.work.api; - -import ru.myitschool.work.api.entity.Employee; - -public interface HandlersResultAPI { - void handlerVerificationLogin(String login, boolean result); - void handlerGetEmployee(Employee employee); - void handlerVisit(int result); -} \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/api/RequestsAPI.java b/app/src/main/java/ru/myitschool/work/api/RequestsAPI.java deleted file mode 100644 index e5b3123..0000000 --- a/app/src/main/java/ru/myitschool/work/api/RequestsAPI.java +++ /dev/null @@ -1,23 +0,0 @@ -package ru.myitschool.work.api; - -import retrofit2.Call; -import retrofit2.http.Body; -import retrofit2.http.GET; -import retrofit2.http.PATCH; -import retrofit2.http.Path; -import ru.myitschool.work.api.entity.Code; -import ru.myitschool.work.api.entity.Employee; - -public interface RequestsAPI { - // Тут будут пути и типы api-запросов. - - // Запрос для проверки пользователя, используется при входе. - @GET("/api/{login}/auth") - Call verificationLogin(@Path("login") String login); - - @GET("/api/{login}/info") - Call getEmployee(@Path("login") String login); - - @PATCH("/api/{login}/open") - Call visit(@Path("login") String login, @Body Code code); -} \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/api/data/CredentialsDataSource.java b/app/src/main/java/ru/myitschool/work/api/data/CredentialsDataSource.java new file mode 100644 index 0000000..ee16b37 --- /dev/null +++ b/app/src/main/java/ru/myitschool/work/api/data/CredentialsDataSource.java @@ -0,0 +1,36 @@ +package ru.myitschool.work.api.data; + +import androidx.annotation.NonNull; + +import org.jetbrains.annotations.Nullable; + +import okhttp3.Credentials; +import ru.myitschool.work.api.data.network.RetrofitFactory; +import ru.myitschool.work.api.data.source.SignApi; + +public class CredentialsDataSource { + private static CredentialsDataSource INSTANCE; + private final SignApi signApi = RetrofitFactory.getInstance().getSignApi(); + + private CredentialsDataSource() { + } + + public static synchronized CredentialsDataSource getInstance() { + if (INSTANCE == null) INSTANCE = new CredentialsDataSource(); + return INSTANCE; + } + + @Nullable private String authData = null; + + public @Nullable String getAuthData() { + return authData; + } + + public void updateLogin(@NonNull String email, @Nullable String password) { + authData = Credentials.basic(email, password); + } + + public void logout() { + authData = null; + } +} diff --git a/app/src/main/java/ru/myitschool/work/api/data/EmployeeRepositoryImpl.java b/app/src/main/java/ru/myitschool/work/api/data/EmployeeRepositoryImpl.java new file mode 100644 index 0000000..c5c7fff --- /dev/null +++ b/app/src/main/java/ru/myitschool/work/api/data/EmployeeRepositoryImpl.java @@ -0,0 +1,121 @@ +package ru.myitschool.work.api.data; + +import androidx.annotation.NonNull; + +import ru.myitschool.work.api.data.dto.employee.EmployeeDTO; +import ru.myitschool.work.api.data.network.RetrofitFactory; +import ru.myitschool.work.api.data.source.EmployeeApi; +import ru.myitschool.work.api.data.utils.CallToConsumer; +import ru.myitschool.work.api.domain.EmployeeRepository; +import ru.myitschool.work.api.domain.entity.Status; +import ru.myitschool.work.api.domain.entity.employee.EmpolyeeEntity; +import ru.myitschool.work.api.domain.entity.employee.ItemEmployeeEntity; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Consumer; + +public class EmployeeRepositoryImpl implements EmployeeRepository { + + private static EmployeeRepositoryImpl INSTANCE; + private final EmployeeApi employeeApi = RetrofitFactory.getInstance().getEmployeeApi(); + + private EmployeeRepositoryImpl() { + } + + public static synchronized EmployeeRepositoryImpl getInstance() { + if (INSTANCE == null) INSTANCE = new EmployeeRepositoryImpl(); + return INSTANCE; + } +// @Override +// public void getAllEmployees(@NonNull Consumer>> callback) { +// employeeApi.getAll().enqueue(new CallToConsumer<>( +// callback, +// employeeDTOS -> { +// if (employeeDTOS == null) return null; +// +// ArrayList result = new ArrayList<>(employeeDTOS.size()); +// +// for (EmployeeDTO employeeDTO : employeeDTOS) { +// if (employeeDTO == null) continue; +// +// final long id_ = employeeDTO.id; +// final String name = employeeDTO.name; +// final String surname = employeeDTO.surname; +// final String patronymic = employeeDTO.patronymic; +// final String profileImageUrl = employeeDTO.profileImageUrl; +// final String officeName = employeeDTO.officeName; +// final String position = employeeDTO.position; +// final boolean visitStatus = employeeDTO.visitStatus; +// +// if (name != null && surname != null && profileImageUrl != null && +// officeName != null && position != null) { +// +// result.add(new ItemEmployeeEntity(id_, name, surname, patronymic, +// profileImageUrl, officeName, position, visitStatus)); +// } +// } +// return result; +// } +// )); +// } + +// @Override +// public ItemEmployeeEntity getEmployeeById(long id, @NonNull Consumer> callback) { +// employeeApi.getEmployeeById(id).enqueue(new CallToConsumer<>( +// callback, +// employeeDTO -> { +// +// final long id_ = employeeDTO.id; +// final String name = employeeDTO.name; +// final String surname = employeeDTO.surname; +// final String patronymic = employeeDTO.patronymic; +// final String profileImageUrl = employeeDTO.profileImageUrl; +// final String officeName = employeeDTO.officeName; +// final String role = employeeDTO.role; // строка либо user, либо admin +// final boolean visitStatus =employeeDTO.visitStatus; +// if (name != null && surname != null && +// role != null && officeName != null) { +// +// assert profileImageUrl != null; +// return new ItemEmployeeEntity(id_, name, surname, patronymic, profileImageUrl, officeName, role,visitStatus); +// } else return null; +// } +// )); +// } + + @Override + public void getAllEmployees(@NonNull Consumer>> callback) { + + } + + @Override + public ItemEmployeeEntity getEmployeeById(long id, @NonNull Consumer> callback) { + return null; + } + + @Override + public void getEmployeeByEmail(@NonNull String email, @NonNull Consumer> callback) { + + } + + @Override + public void getEmployeeByTelephone(@NonNull String telephone, @NonNull Consumer> callback) { + + } + + @Override + public void updateEmployee(long id, @NonNull EmployeeDTO employeeDTO, @NonNull Consumer> callback) { + + } + + @Override + public void deleteEmployee(long id, @NonNull Consumer> callback) { + + } + + @Override + public void patchEmployeerOfficeId(long id, long officeId, @NonNull Consumer> callback) { + + } +} diff --git a/app/src/main/java/ru/myitschool/work/api/data/OfficeRepositoryImpl.java b/app/src/main/java/ru/myitschool/work/api/data/OfficeRepositoryImpl.java new file mode 100644 index 0000000..2b65edd --- /dev/null +++ b/app/src/main/java/ru/myitschool/work/api/data/OfficeRepositoryImpl.java @@ -0,0 +1,94 @@ +package ru.myitschool.work.api.data; + +import androidx.annotation.NonNull; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Consumer; + +import retrofit2.Call; +import ru.myitschool.work.api.data.dto.OfficeDTO; +import ru.myitschool.work.api.data.dto.TerminalDTO; +import ru.myitschool.work.api.data.dto.employee.EmployeeItemDTO; +import ru.myitschool.work.api.data.network.RetrofitFactory; +import ru.myitschool.work.api.data.source.OfficeApi; +import ru.myitschool.work.api.data.utils.CallToConsumer; +import ru.myitschool.work.api.domain.entity.office.OfficeEntity; + +public class OfficeRepositoryImpl implements OfficeApi{ + private static OfficeRepositoryImpl INSTANCE; + private final OfficeApi officeApi = RetrofitFactory.getInstance().getOfficeApi(); + + private OfficeRepositoryImpl() { + } + + public static synchronized OfficeRepositoryImpl getInstance() { + if (INSTANCE == null) INSTANCE = new OfficeRepositoryImpl(); + return INSTANCE; + } + +// @Override +// public Call> getAllOffices() { +// officeApi.getAllOffices().enqueue(new CallToConsumer<>( +// officeDTOS -> { +// if (officeDTOS == null) return null; +// +// ArrayList result = new ArrayList<>(officeDTOS.size()); +// +// for (OfficeDTO officeDTO : officeDTOS) { +// if (officeDTO == null) continue; +// +// final long id = officeDTO.id; +// final String name = officeDTO.name; +// final String description = officeDTO.description; +// final String address = officeDTO.address; +// final Double latitude = officeDTO.latitude; +// final Double longitude = officeDTO.longitude; +// final String linkLogo = officeDTO.linkLogo; +// final String telephone = officeDTO.telephone; +// final String email = officeDTO.email; +// final List employeers = officeDTO.employees; +// final List terminals = officeDTO.terminals; +// +// +// if (name != null && address != null && linkLogo != null && telephone != null && employeers != null && terminals !=null) { +// +// result.add(new OfficeEntity(id, name, description, address, +// latitude, longitude, linkLogo, telephone,email, employeers,terminals)); +// } +// } +// return result; +// } +// )); +// } + + @Override + public Call> getAllOffices() { + return null; + } + + @Override + public Call getOfficesById(long id) { + return null; + } + + @Override + public Call> getSortedOffices(double latitude, double longitude) { + return null; + } + + @Override + public Call createOffice(OfficeDTO centerDTO) { + return null; + } + + @Override + public Call updateOffice(long id, OfficeDTO centerDTO) { + return null; + } + + @Override + public Call deleteEmployee(long id) { + return null; + } +} diff --git a/app/src/main/java/ru/myitschool/work/api/data/SignRepositoryImpl.java b/app/src/main/java/ru/myitschool/work/api/data/SignRepositoryImpl.java new file mode 100644 index 0000000..ecca9fa --- /dev/null +++ b/app/src/main/java/ru/myitschool/work/api/data/SignRepositoryImpl.java @@ -0,0 +1,111 @@ +package ru.myitschool.work.api.data; + +import androidx.annotation.NonNull; + +import java.util.List; +import java.util.function.Consumer; + +import ru.myitschool.work.api.data.dto.employee.EmployeeCreateDTO; +import ru.myitschool.work.api.data.network.RetrofitFactory; +import ru.myitschool.work.api.data.source.SignApi; +import ru.myitschool.work.api.data.utils.CallToConsumer; +import ru.myitschool.work.api.domain.SignRepository; +import ru.myitschool.work.api.domain.entity.Status; +import ru.myitschool.work.api.domain.entity.employee.EmpolyeeEntity; + +public class SignRepositoryImpl implements SignRepository { + private static SignRepositoryImpl INSTANCE; + private final SignApi signApi = RetrofitFactory.getInstance().getSignApi(); + private final CredentialsDataSource credentialsDataSource = CredentialsDataSource.getInstance(); + + private SignRepositoryImpl() { + } + + public static synchronized SignRepositoryImpl getInstance() { + if (INSTANCE == null) INSTANCE = new SignRepositoryImpl(); + return INSTANCE; + } + + @Override + public void createEmployee(@NonNull EmployeeCreateDTO employeeCreateDTO, @NonNull Consumer> callback) { + signApi.register(employeeCreateDTO).enqueue(new CallToConsumer<>( + callback, + employeeDTO -> { + if (employeeDTO == null) return null; + + final long id_ = employeeDTO.id; + final String name = employeeDTO.name; + final String surname = employeeDTO.surname; + final String patronymic = employeeDTO.patronymic; + final String telephone = employeeDTO.telephone; + final String email_= employeeDTO.email; + final long officeId = employeeDTO.officeId; + final String officeName = employeeDTO.officeName; + final String officeUrl= employeeDTO.officeImageUrl; + final String possition = employeeDTO.position; + final String role = employeeDTO.role; + final String profileImageUrl= employeeDTO.profileImageUrl; + final boolean visitStatus= employeeDTO.visitStatus; + final String startVisit= employeeDTO.startVisitDateTime; + final List visitIdLast30Days = employeeDTO.visitsIdLast30Days; + final long totalVisitTimeLast30Days = employeeDTO.totalTimeVisitsLast30Days; + final String curentOfficeName = employeeDTO.currentOfficeName; + final String createdAt= employeeDTO.createAt; + + if (name != null && surname != null && telephone != null && + email_ != null && officeName != null && officeUrl != null && + possition != null && role != null && startVisit != null && + visitIdLast30Days != null && curentOfficeName != null && + createdAt != null) { + + return new EmpolyeeEntity(id_, name, surname, patronymic, + telephone, email_, officeId, officeName, officeUrl, possition, role, profileImageUrl, + visitStatus, startVisit, visitIdLast30Days, totalVisitTimeLast30Days, curentOfficeName, createdAt); + } else return null; + }) + ); + } + + @Override + public void login(@NonNull String email, @NonNull String password, @NonNull Consumer> callback) { + credentialsDataSource.updateLogin(email, password); + signApi.login().enqueue(new CallToConsumer<>(callback, employeeDTO -> { + if (employeeDTO == null) return null; + + final long id_ = employeeDTO.id; + final String name = employeeDTO.name; + final String surname = employeeDTO.surname; + final String patronymic = employeeDTO.patronymic; + final String telephone = employeeDTO.telephone; + final String email_= employeeDTO.email; + final long officeId = employeeDTO.officeId; + final String officeName = employeeDTO.officeName; + final String officeUrl= employeeDTO.officeImageUrl; + final String possition = employeeDTO.position; + final String role = employeeDTO.role; + final String profileImageUrl= employeeDTO.profileImageUrl; + final boolean visitStatus= employeeDTO.visitStatus; + final String startVisit= employeeDTO.startVisitDateTime; + final List visitIdLast30Days = employeeDTO.visitsIdLast30Days; + final long totalVisitTimeLast30Days = employeeDTO.totalTimeVisitsLast30Days; + final String curentOfficeName = employeeDTO.currentOfficeName; + final String createdAt= employeeDTO.createAt; + + if (name != null && surname != null && telephone != null && + email_ != null && officeName != null && officeUrl != null && + possition != null && role != null && startVisit != null && + visitIdLast30Days != null && curentOfficeName != null && + createdAt != null) { + + return new EmpolyeeEntity(id_, name, surname, patronymic, + telephone, email_, officeId, officeName, officeUrl, possition, role, profileImageUrl, + visitStatus, startVisit, visitIdLast30Days, totalVisitTimeLast30Days, curentOfficeName, createdAt); + } else return null; + })); + } + + @Override + public void logout() { + credentialsDataSource.logout(); + } +} diff --git a/app/src/main/java/ru/myitschool/work/api/data/VisitRepositoryImpl.java b/app/src/main/java/ru/myitschool/work/api/data/VisitRepositoryImpl.java new file mode 100644 index 0000000..2947949 --- /dev/null +++ b/app/src/main/java/ru/myitschool/work/api/data/VisitRepositoryImpl.java @@ -0,0 +1,99 @@ +package ru.myitschool.work.api.data; + +import androidx.annotation.NonNull; + +import com.example.myapplication.api.domain.entity.visit.VisitEntity; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; +import java.util.function.Consumer; + +import ru.myitschool.work.api.data.dto.VisitDTO; +import ru.myitschool.work.api.data.network.RetrofitFactory; +import ru.myitschool.work.api.data.source.VisitApi; +import ru.myitschool.work.api.data.utils.CallToConsumer; +import ru.myitschool.work.api.domain.VisitRepository; +import ru.myitschool.work.api.domain.entity.Status; +import com.example.myapplication.api.domain.entity.visit.VisitEntity; + + +public class VisitRepositoryImpl implements VisitRepository { + private static VisitRepositoryImpl INSTANCE; + private final VisitApi visitApi = RetrofitFactory.getInstance().getVisitApi(); + + + public static synchronized VisitRepositoryImpl getInstance() { + if (INSTANCE == null) INSTANCE = new VisitRepositoryImpl(); + return INSTANCE; + } + + @Override + public void getAllVisits(@NonNull Consumer>> callback) { + visitApi.getAll().enqueue(new CallToConsumer<>( + callback, + visitDTOS -> { + if (visitDTOS == null) return null; + + ArrayList result = new ArrayList<>(visitDTOS.size()); + + for (VisitDTO visitDTO : visitDTOS) { + if (visitDTO == null) continue; + + final long id = visitDTO.id; + final LocalDateTime startVisit = visitDTO.startVisit; + final LocalDateTime endVisit = visitDTO.endVisit; + final String totalTime =visitDTO.durationVisit; + final boolean isFinished = visitDTO.isFinished; + final long startTerminal = visitDTO.startTertminal; + final long endTerminal = visitDTO.endTerminal; + + if (startVisit != null && endVisit != null && totalTime != null && isFinished) { + result.add(new VisitEntity(id, startVisit, endVisit, totalTime, isFinished,startTerminal,endTerminal)); + } + } + return result; + } + )); + } + + @Override + public void getAllByVisitId(long id, @NonNull Consumer>> callback) { + + } + +// @Override +// public void getAllByVisitId(long id, @NonNull Consumer>> callback) { +// visitApi.getVisitById(id).enqueue(new CallToConsumer<>( +// callback, +// visitDTOS -> { +// if (visitDTOS == null) return null; +// +// ArrayList result = new ArrayList<>(visitDTOS.size()); +// +// for (VisitDTO visitDTO : visitDTOS) { +// if (visitDTO == null) continue; +// +// final long Id = visitDTO.id; +// final LocalDateTime startVisit = visitDTO.startVisit; +// final LocalDateTime endVisit = visitDTO.endVisit; +// final String totalTime =visitDTO.durationVisit; +// final boolean isFinished = visitDTO.isFinished; +// final long startTerminal = visitDTO.startTertminal; +// final long endTerminal = visitDTO.endTerminal; +// +// if (startVisit != null && endVisit != null && totalTime != null && isFinished) { +// result.add(new VisitEntity(Id, startVisit, endVisit, totalTime, isFinished,startTerminal,endTerminal)); +// } +// } +// return result; +// } +// )); +// } + + /* это если время останется. Шаблон есть фуловый, только на сервере надо + @Override + public void createVisit(@NonNull NotificationDTO notificationDTO, @NonNull Consumer> callback) { + + }*/ +} diff --git a/app/src/main/java/ru/myitschool/work/api/data/dto/OfficeDTO.java b/app/src/main/java/ru/myitschool/work/api/data/dto/OfficeDTO.java new file mode 100644 index 0000000..3597991 --- /dev/null +++ b/app/src/main/java/ru/myitschool/work/api/data/dto/OfficeDTO.java @@ -0,0 +1,47 @@ +package ru.myitschool.work.api.data.dto; + +import androidx.annotation.Nullable; + +import com.google.gson.annotations.SerializedName; + +import java.util.List; + +import ru.myitschool.work.api.data.dto.employee.EmployeeItemDTO; + +public class OfficeDTO { + + @Nullable + @SerializedName("id") + public long id; + + @Nullable + @SerializedName("name") + public String name; + @Nullable + @SerializedName("description") + public String description; + @Nullable + @SerializedName("address") + public String address; + @Nullable + @SerializedName("latitude") + public Double latitude; + @Nullable + @SerializedName("longitude") + public Double longitude; + @Nullable + @SerializedName("linkLogo") + public String linkLogo; + @Nullable + @SerializedName("telephone") + public String telephone; + @Nullable + @SerializedName("email") + public String email; + @Nullable + @SerializedName("employees") + public List employees; + @Nullable + @SerializedName("terminals") + public List terminals; +} diff --git a/app/src/main/java/ru/myitschool/work/api/data/dto/PositionDTO.java b/app/src/main/java/ru/myitschool/work/api/data/dto/PositionDTO.java new file mode 100644 index 0000000..18c833f --- /dev/null +++ b/app/src/main/java/ru/myitschool/work/api/data/dto/PositionDTO.java @@ -0,0 +1,23 @@ +package ru.myitschool.work.api.data.dto; + +import androidx.annotation.Nullable; + +import com.google.gson.annotations.SerializedName; + +import java.util.List; + +import ru.myitschool.work.api.data.dto.employee.EmployeeItemDTO; + +public class PositionDTO { + @Nullable + @SerializedName("id") + public long id; + @Nullable + @SerializedName("name") + public String name; + + // Список всех сотрудников с этой должностью. + @Nullable + @SerializedName("employeeItemDTOList") + public List employeeItemDTOList; +} diff --git a/app/src/main/java/ru/myitschool/work/api/data/dto/TerminalDTO.java b/app/src/main/java/ru/myitschool/work/api/data/dto/TerminalDTO.java new file mode 100644 index 0000000..7f0d151 --- /dev/null +++ b/app/src/main/java/ru/myitschool/work/api/data/dto/TerminalDTO.java @@ -0,0 +1,26 @@ +package ru.myitschool.work.api.data.dto; + +import androidx.annotation.Nullable; + +import com.google.gson.annotations.SerializedName; + +public class TerminalDTO { + @Nullable + @SerializedName("id") + public long id; + @Nullable + @SerializedName("name") + public String name; + + // ОЧЕНЬ ВАЖНО!!! при создании терминала code не нужен, но отправлять его нужно. + // При создании пиши вместо code, что хочешь он будет просто игнорироваться. + // Мне просто очень лень делать отдельный TerminalCreateDTO ради одного поля. + + //Мда, вот это я понимаю КОСТЫЛЬ + @Nullable + @SerializedName("code") + public String code; + @Nullable + @SerializedName("officeName") + public String officeName; +} diff --git a/app/src/main/java/ru/myitschool/work/api/data/dto/VisitDTO.java b/app/src/main/java/ru/myitschool/work/api/data/dto/VisitDTO.java new file mode 100644 index 0000000..f2c67dd --- /dev/null +++ b/app/src/main/java/ru/myitschool/work/api/data/dto/VisitDTO.java @@ -0,0 +1,38 @@ +package ru.myitschool.work.api.data.dto; + +import androidx.annotation.Nullable; + +import com.google.gson.annotations.SerializedName; + +import java.time.LocalDateTime; + +public class VisitDTO { + @Nullable + @SerializedName("id") + public long id; + + // Возвращается время начала и конца посещения в формате LocalDateTime.toString(), + // превратить обратно можно с помощью LocalDateTime.parse(). + @Nullable + @SerializedName("startVisit") + public LocalDateTime startVisit; + @Nullable + @SerializedName("endVisit") + public LocalDateTime endVisit; + @Nullable + @SerializedName("isFinished") + public boolean isFinished; + + // Возвращается длительность посещения в формате LocalDateTime.toString(), + // превратить обратно можно с помощью LocalDateTime.parse(). + @Nullable + @SerializedName("durationVisit") + public String durationVisit; + @Nullable + @SerializedName("startTerminal") + public long startTertminal; + + @Nullable + @SerializedName("endTerminal") + public long endTerminal; +} diff --git a/app/src/main/java/ru/myitschool/work/api/data/dto/employee/EmployeeCreateDTO.java b/app/src/main/java/ru/myitschool/work/api/data/dto/employee/EmployeeCreateDTO.java new file mode 100644 index 0000000..edd66fd --- /dev/null +++ b/app/src/main/java/ru/myitschool/work/api/data/dto/employee/EmployeeCreateDTO.java @@ -0,0 +1,35 @@ +package ru.myitschool.work.api.data.dto.employee; + +import androidx.annotation.Nullable; + +import com.google.gson.annotations.SerializedName; + +public class EmployeeCreateDTO { + @Nullable + @SerializedName("name") + public String name; + @Nullable + @SerializedName("longitude") + public String surname; + @Nullable + @SerializedName("patronymic") + public String patronymic; + @Nullable + @SerializedName("telephone") + public String telephone; + @Nullable + @SerializedName("email") + public String email; + @Nullable + @SerializedName("password") + public String password; + @Nullable + @SerializedName("officeName") + public String officeName; // Имя офиса, к которому присоединится работник. + @Nullable + @SerializedName("positionName") + public String positionName; // Должность работника. + @Nullable + @SerializedName("role") + public String role; // строка либо ROLE_USER, либо ROLE_ADMIN +} diff --git a/app/src/main/java/ru/myitschool/work/api/data/dto/employee/EmployeeDTO.java b/app/src/main/java/ru/myitschool/work/api/data/dto/employee/EmployeeDTO.java new file mode 100644 index 0000000..da4da62 --- /dev/null +++ b/app/src/main/java/ru/myitschool/work/api/data/dto/employee/EmployeeDTO.java @@ -0,0 +1,79 @@ +package ru.myitschool.work.api.data.dto.employee; + +import androidx.annotation.Nullable; + +import com.google.gson.annotations.SerializedName; + +import java.util.List; + +public class EmployeeDTO { + @Nullable + @SerializedName("id") + public long id; + + @Nullable + @SerializedName("name") + public String name; + @Nullable + @SerializedName("surname") + public String surname; + @Nullable + @SerializedName("patronymic") + public String patronymic; + @Nullable + @SerializedName("telephone") + public String telephone; + @Nullable + @SerializedName("email") + public String email; + @Nullable + @SerializedName("officeId") + public long officeId; + @Nullable + @SerializedName("officeName") + public String officeName; + @Nullable + @SerializedName("officeImageUrl") + public String officeImageUrl; + @Nullable + @SerializedName("position") + public String position; // Название должности + @Nullable + @SerializedName("role") + public String role; // строка либо ROLE_USER, либо ROLE_ADMIN + @Nullable + @SerializedName("profileImageUrl") + public String profileImageUrl; + + // Текущее состояние входа: false - visit (посещение) ещё не началось, true - visit идёт + @Nullable + @SerializedName("visitStatus") + public boolean visitStatus; + + // Если visitStatus true, то возвращает дату и время начала посещения в формате LocalDateTime.toString(), + // превратить обратно можно с помощью LocalDateTime.parse(). + // Если visitStatus false, то возвращает null. + @Nullable + @SerializedName("startVisitDateTime") + public String startVisitDateTime; + @Nullable + @SerializedName("visitsIdLast30Days") + public List visitsIdLast30Days; // Список Id посещений за последние 30 дней. + + // Возвращает количество отработанных часов за последний месяц. + @Nullable + @SerializedName("totalTimeVisitsLast30Days") + public long totalTimeVisitsLast30Days; + + // (Возможно это стоит убрать) Название офиса, в котором сейчас находится работник. + // Если visitStatus false, возвращает null. + @Nullable + @SerializedName("currentOfficeName") + public String currentOfficeName; + + // Возвращает время регистрации в формате LocalDateTime.toString(), + // превратить обратно можно с помощью LocalDateTime.parse(). + @Nullable + @SerializedName("createAt") + public String createAt; +} \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/api/data/dto/employee/EmployeeItemDTO.java b/app/src/main/java/ru/myitschool/work/api/data/dto/employee/EmployeeItemDTO.java new file mode 100644 index 0000000..f5602fc --- /dev/null +++ b/app/src/main/java/ru/myitschool/work/api/data/dto/employee/EmployeeItemDTO.java @@ -0,0 +1,34 @@ +package ru.myitschool.work.api.data.dto.employee; + +import androidx.annotation.Nullable; + +import com.google.gson.annotations.SerializedName; + +public class EmployeeItemDTO { + @Nullable + @SerializedName("id") + public long id; + @Nullable + @SerializedName("name") + public String name; + @Nullable + @SerializedName("surname") + public String surname; + @Nullable + @SerializedName("patronymic") + public String patronymic; + @Nullable + @SerializedName("profileImageUrl") + public String profileImageUrl; + @Nullable + @SerializedName("officeName") + public String officeName; + @Nullable + @SerializedName("position") + public String position; // Название должности + + // Текущее состояние входа: false - visit (посещение) ещё не началось, true - visit идёт + @Nullable + @SerializedName("visitStatus") + public boolean visitStatus; +} diff --git a/app/src/main/java/ru/myitschool/work/api/data/network/RetrofitFactory.java b/app/src/main/java/ru/myitschool/work/api/data/network/RetrofitFactory.java new file mode 100644 index 0000000..dc55b68 --- /dev/null +++ b/app/src/main/java/ru/myitschool/work/api/data/network/RetrofitFactory.java @@ -0,0 +1,58 @@ +package ru.myitschool.work.api.data.network; + +import com.example.myapplication.core.UrlConstants; + +import okhttp3.OkHttpClient; +import okhttp3.Request; +import retrofit2.Retrofit; +import retrofit2.converter.gson.GsonConverterFactory; +import ru.myitschool.work.api.data.CredentialsDataSource; +import ru.myitschool.work.api.data.source.EmployeeApi; +import ru.myitschool.work.api.data.source.OfficeApi; +import ru.myitschool.work.api.data.source.SignApi; +import ru.myitschool.work.api.data.source.VisitApi; + +public class RetrofitFactory { + private static RetrofitFactory INSTANCE; + + private RetrofitFactory() { + } + + public static synchronized RetrofitFactory getInstance() { + if (INSTANCE == null) INSTANCE = new RetrofitFactory(); + return INSTANCE; + } + + private final OkHttpClient.Builder client = new OkHttpClient.Builder() + .addInterceptor(chain -> { + String authData = CredentialsDataSource.getInstance().getAuthData(); + + if (authData == null) return chain.proceed(chain.request()); + else { + Request request = chain.request() + .newBuilder() + .addHeader("Authorization", authData) + .build(); + return chain.proceed(request); + } + }); + + public Retrofit retrofit = new Retrofit.Builder() + .baseUrl(UrlConstants.BASE_URL) + .client(client.build()) + .addConverterFactory(GsonConverterFactory.create()) + .build(); + + public EmployeeApi getEmployeeApi() { + return retrofit.create(EmployeeApi.class); + } + + public SignApi getSignApi() { + return retrofit.create(SignApi.class); + } + + public OfficeApi getOfficeApi() { + return retrofit.create(OfficeApi.class); + } + public VisitApi getVisitApi(){ return retrofit.create(VisitApi.class);} +} diff --git a/app/src/main/java/ru/myitschool/work/api/data/source/EmployeeApi.java b/app/src/main/java/ru/myitschool/work/api/data/source/EmployeeApi.java new file mode 100644 index 0000000..f256fbc --- /dev/null +++ b/app/src/main/java/ru/myitschool/work/api/data/source/EmployeeApi.java @@ -0,0 +1,35 @@ +package ru.myitschool.work.api.data.source; + +import java.util.List; + +import retrofit2.Call; +import retrofit2.http.Body; +import retrofit2.http.DELETE; +import retrofit2.http.GET; +import retrofit2.http.PATCH; +import retrofit2.http.PUT; +import retrofit2.http.Path; +import ru.myitschool.work.api.data.dto.employee.EmployeeDTO; + +public interface EmployeeApi { + @GET("api/v1/employees") + Call> getAll(); + + @GET("api/v1/employees/{id}") + Call getEmployeeById(@Path("id") long id); + + @GET("api/v1/employees/email/{email}") + Call getEmployeeByEmail(@Path("email") String email); + + @GET("api/v1/employees/telephone/{telephone}") + Call getEmployeeByTelephone(@Path("telephone") String telephone); + + @PUT("api/v1/employees/{id}") + Call updateEmployee(@Path("id") long id, @Body EmployeeDTO employeeDTO); + + @DELETE("api/v1/employees/{id}") + Call deleteEmployee(@Path("id") long id); + + @PATCH("api/v1/employees/{id}/{centerId}") + Call patchEmployee(@Path("id") long id, @Path("centerId") long centerId); //перепривязка к другому центру +} diff --git a/app/src/main/java/ru/myitschool/work/api/data/source/OfficeApi.java b/app/src/main/java/ru/myitschool/work/api/data/source/OfficeApi.java new file mode 100644 index 0000000..f5d53cf --- /dev/null +++ b/app/src/main/java/ru/myitschool/work/api/data/source/OfficeApi.java @@ -0,0 +1,33 @@ +package ru.myitschool.work.api.data.source; + +import java.util.List; + +import retrofit2.Call; +import retrofit2.http.Body; +import retrofit2.http.DELETE; +import retrofit2.http.GET; +import retrofit2.http.POST; +import retrofit2.http.PUT; +import retrofit2.http.Path; +import retrofit2.http.Query; +import ru.myitschool.work.api.data.dto.OfficeDTO; + +public interface OfficeApi { + @GET("api/v1/offices") + Call> getAllOffices(); + + @GET("api/v1/offices/{id}") + Call getOfficesById(@Path("id") long id); + + @GET("api/v1/offices/sorted/distance") + Call> getSortedOffices(@Query("latitude") double latitude, @Query("longitude") double longitude); + + @POST("api/v1/offices") + Call createOffice(@Body OfficeDTO centerDTO); + + @PUT("api/v1/offices/{id}") + Call updateOffice(@Path("id") long id, @Body OfficeDTO centerDTO); + + @DELETE("api/v1/offices/{id}") + Call deleteEmployee(@Path("id") long id); +} diff --git a/app/src/main/java/ru/myitschool/work/api/data/source/SignApi.java b/app/src/main/java/ru/myitschool/work/api/data/source/SignApi.java new file mode 100644 index 0000000..b0755a2 --- /dev/null +++ b/app/src/main/java/ru/myitschool/work/api/data/source/SignApi.java @@ -0,0 +1,18 @@ +package ru.myitschool.work.api.data.source; + +import retrofit2.Call; +import retrofit2.http.Body; +import retrofit2.http.GET; +import retrofit2.http.POST; +import retrofit2.http.Path; +import ru.myitschool.work.api.data.dto.employee.EmployeeCreateDTO; +import ru.myitschool.work.api.data.dto.employee.EmployeeDTO; + +public interface SignApi { + @POST("api/v1/employees/authorization/register") + Call register(@Body EmployeeCreateDTO employeeCreateDTO); + + @GET("api/v1/employees/authorization//login") + Call login(); + +} diff --git a/app/src/main/java/ru/myitschool/work/api/data/source/VisitApi.java b/app/src/main/java/ru/myitschool/work/api/data/source/VisitApi.java new file mode 100644 index 0000000..09ffcfa --- /dev/null +++ b/app/src/main/java/ru/myitschool/work/api/data/source/VisitApi.java @@ -0,0 +1,29 @@ +package ru.myitschool.work.api.data.source; +import java.util.List; + +import retrofit2.Call; +import retrofit2.http.Body; +import retrofit2.http.DELETE; +import retrofit2.http.GET; +import retrofit2.http.PATCH; +import retrofit2.http.POST; +import retrofit2.http.PUT; +import retrofit2.http.Path; +import ru.myitschool.work.api.data.dto.VisitDTO; + +public interface VisitApi { + @GET("api/v1/visits") + Call> getAll(); + + @GET("api/v1/visits/{id}") + Call getVisitById(@Path("id") long id); + + @GET("api/v1/visits/{empoyee_id}") + Call getVisitByEmloyeeId(@Path("id") long empoyee_id); + + @POST("api/v1/visits") + Call stertVisit(@Body VisitDTO visitDTO); + + @PATCH("api/v1/visits/{id}") + Call endVisit(@Path("id") long id); +} \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/api/data/utils/CallToConsumer.java b/app/src/main/java/ru/myitschool/work/api/data/utils/CallToConsumer.java new file mode 100644 index 0000000..e71494c --- /dev/null +++ b/app/src/main/java/ru/myitschool/work/api/data/utils/CallToConsumer.java @@ -0,0 +1,40 @@ +package ru.myitschool.work.api.data.utils; + +import androidx.annotation.NonNull; + +import java.util.function.Consumer; + +import retrofit2.Call; +import retrofit2.Callback; +import retrofit2.Response; +import ru.myitschool.work.api.domain.entity.Status; + +public class CallToConsumer implements Callback { + @NonNull + private final Consumer> callback; + + @NonNull + private final Mapper mapper; + + public CallToConsumer( + @NonNull Consumer> callback, + @NonNull Mapper mapper + ) { + this.callback = callback; + this.mapper = mapper; + } + + @Override + public void onResponse(@NonNull Call call, @NonNull Response response) { + callback.accept(new Status<>(response.code(), mapper.map(response.body()), null)); + } + + @Override + public void onFailure(@NonNull Call call, @NonNull Throwable t) { + callback.accept(new Status<>(-1, null, t)); + } + + public interface Mapper { + DEST map(SOURCE source); + } +} diff --git a/app/src/main/java/ru/myitschool/work/api/domain/EmployeeRepository.java b/app/src/main/java/ru/myitschool/work/api/domain/EmployeeRepository.java new file mode 100644 index 0000000..c0d3858 --- /dev/null +++ b/app/src/main/java/ru/myitschool/work/api/domain/EmployeeRepository.java @@ -0,0 +1,21 @@ +package ru.myitschool.work.api.domain; + +import androidx.annotation.NonNull; + +import java.util.List; +import java.util.function.Consumer; + +import ru.myitschool.work.api.data.dto.employee.EmployeeDTO; +import ru.myitschool.work.api.domain.entity.Status; +import ru.myitschool.work.api.domain.entity.employee.EmpolyeeEntity; +import ru.myitschool.work.api.domain.entity.employee.ItemEmployeeEntity; + +public interface EmployeeRepository { + void getAllEmployees(@NonNull Consumer>> callback); + ItemEmployeeEntity getEmployeeById(long id, @NonNull Consumer> callback); + void getEmployeeByEmail(@NonNull String email, @NonNull Consumer> callback); + void getEmployeeByTelephone(@NonNull String telephone, @NonNull Consumer> callback); + void updateEmployee(long id, @NonNull EmployeeDTO employeeDTO, @NonNull Consumer> callback);//переделай после dto + void deleteEmployee(long id, @NonNull Consumer> callback); + void patchEmployeerOfficeId(long id, long officeId, @NonNull Consumer> callback); +} diff --git a/app/src/main/java/ru/myitschool/work/api/domain/OfficeRepository.java b/app/src/main/java/ru/myitschool/work/api/domain/OfficeRepository.java new file mode 100644 index 0000000..ed4010a --- /dev/null +++ b/app/src/main/java/ru/myitschool/work/api/domain/OfficeRepository.java @@ -0,0 +1,13 @@ +package ru.myitschool.work.api.domain; + +import androidx.annotation.NonNull; + +import java.util.List; +import java.util.function.Consumer; +import ru.myitschool.work.api.domain.entity.Status; +import ru.myitschool.work.api.domain.entity.office.OfficeEntity; + + +public interface OfficeRepository { + void getAllOffices(@NonNull Consumer>> callback); +} diff --git a/app/src/main/java/ru/myitschool/work/api/domain/SignRepository.java b/app/src/main/java/ru/myitschool/work/api/domain/SignRepository.java new file mode 100644 index 0000000..e87253b --- /dev/null +++ b/app/src/main/java/ru/myitschool/work/api/domain/SignRepository.java @@ -0,0 +1,15 @@ +package ru.myitschool.work.api.domain; + +import androidx.annotation.NonNull; + +import java.util.function.Consumer; + +import ru.myitschool.work.api.data.dto.employee.EmployeeCreateDTO; +import ru.myitschool.work.api.domain.entity.Status; +import ru.myitschool.work.api.domain.entity.employee.EmpolyeeEntity; + +public interface SignRepository { + void createEmployee(@NonNull EmployeeCreateDTO employeeRegisterDTO, @NonNull Consumer> callback); + void login(@NonNull String email, @NonNull String password, @NonNull Consumer> callback); + void logout(); +} diff --git a/app/src/main/java/ru/myitschool/work/api/domain/VisitRepository.java b/app/src/main/java/ru/myitschool/work/api/domain/VisitRepository.java new file mode 100644 index 0000000..6495efb --- /dev/null +++ b/app/src/main/java/ru/myitschool/work/api/domain/VisitRepository.java @@ -0,0 +1,17 @@ +package ru.myitschool.work.api.domain; + +import androidx.annotation.NonNull; + +import com.example.myapplication.api.domain.entity.visit.VisitEntity; + +import java.util.List; +import java.util.function.Consumer; + +import ru.myitschool.work.api.domain.entity.Status; + +public interface VisitRepository { + void getAllVisits(@NonNull Consumer>> callback); + void getAllByVisitId(long id, @NonNull Consumer>> callback); + + //void createVisit(@NonNull NotificationDTO notificationDTO, @NonNull Consumer> callback); если время останется +} diff --git a/app/src/main/java/ru/myitschool/work/api/domain/entity/Status.java b/app/src/main/java/ru/myitschool/work/api/domain/entity/Status.java new file mode 100644 index 0000000..4d4720b --- /dev/null +++ b/app/src/main/java/ru/myitschool/work/api/domain/entity/Status.java @@ -0,0 +1,30 @@ +package ru.myitschool.work.api.domain.entity; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +public class Status { + final int statusCod; + @Nullable private final T value; + @Nullable private final Throwable errors; + + public Status(int statusCod, @Nullable T value, @Nullable Throwable errors) { + this.statusCod = statusCod; + this.value = value; + this.errors = errors; + } + + public int getStatusCod() { + return statusCod; + } + + @Nullable + public T getValue() { + return value; + } + + @Nullable + public Throwable getErrors() { + return errors; + } +} diff --git a/app/src/main/java/ru/myitschool/work/api/domain/entity/employee/EmpolyeeEntity.java b/app/src/main/java/ru/myitschool/work/api/domain/entity/employee/EmpolyeeEntity.java new file mode 100644 index 0000000..b0ab5b4 --- /dev/null +++ b/app/src/main/java/ru/myitschool/work/api/domain/entity/employee/EmpolyeeEntity.java @@ -0,0 +1,152 @@ +package ru.myitschool.work.api.domain.entity.employee; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import java.util.Date; +import java.util.List; + +public class EmpolyeeEntity { + @NonNull private final long id; + @NonNull private final String name; + @NonNull private final String surname; + @NonNull private final String patronymic; + @NonNull private final String telephone; + @NonNull private final String email; + + @NonNull private final long officeId; + @NonNull private final String officeName; + @NonNull private final String officeImageUrl; + + @NonNull private final String position; // Название должности + @NonNull private final String role; // строка либо ROLE_USER, либо ROLE_ADMIN + + @NonNull private final String profileImageUrl; + + // Текущее состояние входа: false - visit (посещение) ещё не началось, true - visit идёт + @NonNull private final boolean visitStatus; + + // Если visitStatus true, то возвращает дату и время начала посещения в формате LocalDateTime.toString(), + // превратить обратно можно с помощью LocalDateTime.parse(). + // Если visitStatus false, то возвращает null. + @NonNull private final String startVisitDateTime; + @NonNull private final List visitsIdLast30Days; // Список Id посещений за последние 30 дней. + + // Возвращает количество отработанных часов за последний месяц. + @NonNull private final long totalTimeVisitsLast30Days; + + // (Возможно это стоит убрать) Название офиса, в котором сейчас находится работник. + // Если visitStatus false, возвращает null. + @NonNull private final String currentOfficeName; + + // Возвращает время регистрации в формате LocalDateTime.toString(), + // превратить обратно можно с помощью LocalDateTime.parse(). + @NonNull private final String createAt; + + public EmpolyeeEntity(long id, @NonNull String name, @NonNull String surname, @NonNull String patronymic, @NonNull String telephone, @NonNull String email, long officeId, @NonNull String officeName, @NonNull String officeImageUrl, @NonNull String position, @NonNull String role, @NonNull String profileImageUrl, boolean visitStatus, @NonNull String startVisitDateTime, @NonNull List visitsIdLast30Days, long totalTimeVisitsLast30Days, @NonNull String currentOfficeName, @NonNull String createAt) { + this.id = id; + this.name = name; + this.surname = surname; + this.patronymic = patronymic; + this.telephone = telephone; + this.email = email; + this.officeId = officeId; + this.officeName = officeName; + this.officeImageUrl = officeImageUrl; + this.position = position; + this.role = role; + this.profileImageUrl = profileImageUrl; + this.visitStatus = visitStatus; + this.startVisitDateTime = startVisitDateTime; + this.visitsIdLast30Days = visitsIdLast30Days; + this.totalTimeVisitsLast30Days = totalTimeVisitsLast30Days; + this.currentOfficeName = currentOfficeName; + this.createAt = createAt; + } + + public long getId() { + return id; + } + + @NonNull + public String getName() { + return name; + } + + @NonNull + public String getSurname() { + return surname; + } + + @NonNull + public String getPatronymic() { + return patronymic; + } + + @NonNull + public String getTelephone() { + return telephone; + } + + @NonNull + public String getEmail() { + return email; + } + + public long getOfficeId() { + return officeId; + } + + @NonNull + public String getOfficeName() { + return officeName; + } + + @NonNull + public String getOfficeImageUrl() { + return officeImageUrl; + } + + @NonNull + public String getPosition() { + return position; + } + + @NonNull + public String getRole() { + return role; + } + + @NonNull + public String getProfileImageUrl() { + return profileImageUrl; + } + + public boolean isVisitStatus() { + return visitStatus; + } + + @NonNull + public String getStartVisitDateTime() { + return startVisitDateTime; + } + + @NonNull + public List getVisitsIdLast30Days() { + return visitsIdLast30Days; + } + + public long getTotalTimeVisitsLast30Days() { + return totalTimeVisitsLast30Days; + } + + @NonNull + public String getCurrentOfficeName() { + return currentOfficeName; + } + + @NonNull + public String getCreateAt() { + return createAt; + } +} diff --git a/app/src/main/java/ru/myitschool/work/api/domain/entity/employee/ItemEmployeeEntity.java b/app/src/main/java/ru/myitschool/work/api/domain/entity/employee/ItemEmployeeEntity.java new file mode 100644 index 0000000..c40afd6 --- /dev/null +++ b/app/src/main/java/ru/myitschool/work/api/domain/entity/employee/ItemEmployeeEntity.java @@ -0,0 +1,66 @@ +package ru.myitschool.work.api.domain.entity.employee; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +public class ItemEmployeeEntity { + @NonNull private final long id; + @NonNull private final String name; + @NonNull private final String surname; + @NonNull private final String patronymic; + @NonNull private final String profileImageUrl; + @NonNull private final String officeName; + @NonNull private final String position; // Название должности + + // Текущее состояние входа: false - visit (посещение) ещё не началось, true - visit идёт + @NonNull private final boolean visitStatus; + + public ItemEmployeeEntity(long id, @NonNull String name, @NonNull String surname, @Nullable String patronymic, @NonNull String profileImageUrl, @NonNull String officeName, @NonNull String position, boolean visitStatus) { + this.id = id; + this.name = name; + this.surname = surname; + this.patronymic = patronymic; + this.profileImageUrl = profileImageUrl; + this.officeName = officeName; + this.position = position; + this.visitStatus = visitStatus; + } + + public long getId() { + return id; + } + + @NonNull + public String getName() { + return name; + } + + @NonNull + public String getSurname() { + return surname; + } + + @NonNull + public String getPatronymic() { + return patronymic; + } + + @NonNull + public String getProfileImageUrl() { + return profileImageUrl; + } + + @NonNull + public String getOfficeName() { + return officeName; + } + + @NonNull + public String getPosition() { + return position; + } + + public boolean isVisitStatus() { + return visitStatus; + } +} diff --git a/app/src/main/java/ru/myitschool/work/api/domain/entity/office/OfficeEntity.java b/app/src/main/java/ru/myitschool/work/api/domain/entity/office/OfficeEntity.java new file mode 100644 index 0000000..ef69182 --- /dev/null +++ b/app/src/main/java/ru/myitschool/work/api/domain/entity/office/OfficeEntity.java @@ -0,0 +1,88 @@ +package ru.myitschool.work.api.domain.entity.office; + +import androidx.annotation.NonNull; + +import java.util.List; + +import ru.myitschool.work.api.data.dto.TerminalDTO; +import ru.myitschool.work.api.data.dto.employee.EmployeeItemDTO; + +public class OfficeEntity { + @NonNull private final long id; + @NonNull private final String name; + @NonNull private final String description; + @NonNull private final String address; + @NonNull private final Double latitude; + @NonNull private final Double longitude; + @NonNull private final String linkLogo; + + @NonNull private final String telephone; + @NonNull private final String email; + @NonNull private final List empoyers; // Список id имплоев + @NonNull private final List terminals; + public OfficeEntity(long id, @NonNull String name, @NonNull String description, @NonNull String address, @NonNull Double latitude, @NonNull Double longitude, @NonNull String linkLogo, @NonNull String telephone, @NonNull String email, @NonNull List employers, @NonNull List terminals) { + this.id = id; + this.name = name; + this.description = description; + this.address = address; + this.linkLogo = linkLogo; + this.latitude = latitude; + this.longitude = longitude; + this.telephone = telephone; + this.email = email; + this.empoyers = employers; + this.terminals = terminals; + } + + public long getId() { + return id; + } + + @NonNull + public String getName() { + return name; + } + + @NonNull + public String getAddress() { + return address; + } + + @NonNull + public String getLinkLogo() { + return linkLogo; + } + + @NonNull + public Double getLatitude() { + return latitude; + } + + @NonNull + public Double getLongitude() { + return longitude; + } + + @NonNull + public List getEmpoyers(){ return empoyers;} + + @NonNull + public String getDescription() { + return description; + } + + @NonNull + public List getTerminals() { + return terminals; + } + + @NonNull + public String getTelephone() { + return telephone; + } + + @NonNull + public String getEmail() { + return email; + } +} diff --git a/app/src/main/java/ru/myitschool/work/api/domain/entity/visit/VisitEntity.java b/app/src/main/java/ru/myitschool/work/api/domain/entity/visit/VisitEntity.java new file mode 100644 index 0000000..3fcf5dc --- /dev/null +++ b/app/src/main/java/ru/myitschool/work/api/domain/entity/visit/VisitEntity.java @@ -0,0 +1,57 @@ +package com.example.myapplication.api.domain.entity.visit; + +import androidx.annotation.NonNull; + +import java.time.LocalDateTime; + +public class VisitEntity { + @NonNull private final long id; + @NonNull private final LocalDateTime startVisit; + @NonNull private final LocalDateTime endVisit; + @NonNull private final String totalTime; + @NonNull private final boolean isFinished; + @NonNull private final long startTerminalId; + @NonNull private final long endTerminalId; + + + public VisitEntity(long id, @NonNull LocalDateTime startVisit, @NonNull LocalDateTime endVisit, @NonNull String totalTime, boolean isFinished, long startTerminalId, long endTerminalId) { + this.id = id; + this.startVisit = startVisit; + this.endVisit = endVisit; + this.totalTime = totalTime; + this.isFinished = isFinished; + this.startTerminalId = startTerminalId; + this.endTerminalId = endTerminalId; + } + + public long getId() { + return id; + } + @NonNull + public LocalDateTime getStartVisit() { + return startVisit; + } + + @NonNull + public LocalDateTime getEndVisit() { + return endVisit; + } + + @NonNull + public String getTotalTime() { + return totalTime; + } + + public boolean isFinished() { + return isFinished; + } + + public long getStartTerminalId() { + return startTerminalId; + } + + public long getEndTerminalId() { + return endTerminalId; + } + +} diff --git a/app/src/main/java/ru/myitschool/work/api/domain/useCases/employee/DeleteEmployeeUseCase.java b/app/src/main/java/ru/myitschool/work/api/domain/useCases/employee/DeleteEmployeeUseCase.java new file mode 100644 index 0000000..0476b04 --- /dev/null +++ b/app/src/main/java/ru/myitschool/work/api/domain/useCases/employee/DeleteEmployeeUseCase.java @@ -0,0 +1,22 @@ +package ru.myitschool.work.api.domain.useCases.employee; + +import androidx.annotation.NonNull; + +import java.util.function.Consumer; + +import ru.myitschool.work.api.domain.EmployeeRepository; +import ru.myitschool.work.api.domain.entity.Status; +import ru.myitschool.work.api.domain.entity.employee.EmpolyeeEntity; + +public class DeleteEmployeeUseCase { + private final EmployeeRepository employeeRepository; + + public DeleteEmployeeUseCase(EmployeeRepository employeeRepository) { + this.employeeRepository = employeeRepository; + } + + + public void execute(long id, @NonNull Consumer> callback) { + employeeRepository.deleteEmployee(id,callback); + } +} diff --git a/app/src/main/java/ru/myitschool/work/api/domain/useCases/employee/GetAllEmployees.java b/app/src/main/java/ru/myitschool/work/api/domain/useCases/employee/GetAllEmployees.java new file mode 100644 index 0000000..f7e76f5 --- /dev/null +++ b/app/src/main/java/ru/myitschool/work/api/domain/useCases/employee/GetAllEmployees.java @@ -0,0 +1,22 @@ +package ru.myitschool.work.api.domain.useCases.employee; + +import androidx.annotation.NonNull; + +import java.util.List; +import java.util.function.Consumer; + +import ru.myitschool.work.api.domain.EmployeeRepository; +import ru.myitschool.work.api.domain.entity.Status; +import ru.myitschool.work.api.domain.entity.employee.EmpolyeeEntity; + +public class GetAllEmployees { + private final EmployeeRepository employeeRepository; + + public GetAllEmployees(EmployeeRepository employeeRepository) { + this.employeeRepository = employeeRepository; + } + + public void execute(@NonNull Consumer>> callback) { + employeeRepository.getAllEmployees(callback); + } +} diff --git a/app/src/main/java/ru/myitschool/work/api/domain/useCases/employee/GetEmloyeeByIdUseCase.java b/app/src/main/java/ru/myitschool/work/api/domain/useCases/employee/GetEmloyeeByIdUseCase.java new file mode 100644 index 0000000..80bcc4e --- /dev/null +++ b/app/src/main/java/ru/myitschool/work/api/domain/useCases/employee/GetEmloyeeByIdUseCase.java @@ -0,0 +1,23 @@ +package ru.myitschool.work.api.domain.useCases.employee; + +import androidx.annotation.NonNull; + + + +import java.util.function.Consumer; + +import ru.myitschool.work.api.domain.EmployeeRepository; +import ru.myitschool.work.api.domain.entity.Status; +import ru.myitschool.work.api.domain.entity.employee.EmpolyeeEntity; + +public class GetEmloyeeByIdUseCase { + private final EmployeeRepository employeeRepository; + + public GetEmloyeeByIdUseCase(EmployeeRepository employeeRepository) { + this.employeeRepository = employeeRepository; + } + + public void execute(long id, @NonNull Consumer> callback) { + employeeRepository.getEmployeeById(id, callback); + } +} diff --git a/app/src/main/java/ru/myitschool/work/api/domain/useCases/employee/GetEmployeeByEmailUseCase.java b/app/src/main/java/ru/myitschool/work/api/domain/useCases/employee/GetEmployeeByEmailUseCase.java new file mode 100644 index 0000000..f7c2a88 --- /dev/null +++ b/app/src/main/java/ru/myitschool/work/api/domain/useCases/employee/GetEmployeeByEmailUseCase.java @@ -0,0 +1,20 @@ +package ru.myitschool.work.api.domain.useCases.employee; + +import androidx.annotation.NonNull; + +import java.util.function.Consumer; + +import ru.myitschool.work.api.domain.EmployeeRepository; +import ru.myitschool.work.api.domain.entity.Status; +import ru.myitschool.work.api.domain.entity.employee.EmpolyeeEntity; + +public class GetEmployeeByEmailUseCase { + private final ru.myitschool.work.api.domain.EmployeeRepository employeeRepository; + + public GetEmployeeByEmailUseCase(EmployeeRepository employeeRepository) { + this.employeeRepository = employeeRepository; + } + + public void execute(@NonNull String email, @NonNull Consumer> callback) { + employeeRepository.getEmployeeByEmail(email, callback); + }} diff --git a/app/src/main/java/ru/myitschool/work/api/domain/useCases/employee/PatchEmployeeOfficeId.java b/app/src/main/java/ru/myitschool/work/api/domain/useCases/employee/PatchEmployeeOfficeId.java new file mode 100644 index 0000000..fad2cae --- /dev/null +++ b/app/src/main/java/ru/myitschool/work/api/domain/useCases/employee/PatchEmployeeOfficeId.java @@ -0,0 +1,20 @@ +package ru.myitschool.work.api.domain.useCases.employee; + +import androidx.annotation.NonNull; + +import java.util.function.Consumer; + +import ru.myitschool.work.api.domain.EmployeeRepository; +import ru.myitschool.work.api.domain.entity.Status; + +public class PatchEmployeeOfficeId { + private final EmployeeRepository employeeRepository; + + public PatchEmployeeOfficeId(EmployeeRepository employeeRepository) { + this.employeeRepository = employeeRepository; + } + + public void execute(long id, long centerId, @NonNull Consumer> callback) { + employeeRepository.patchEmployeerOfficeId(id, centerId, callback); + } +} diff --git a/app/src/main/java/ru/myitschool/work/api/domain/useCases/employee/UpdateEmployeeUseCase.java b/app/src/main/java/ru/myitschool/work/api/domain/useCases/employee/UpdateEmployeeUseCase.java new file mode 100644 index 0000000..3a2bbb5 --- /dev/null +++ b/app/src/main/java/ru/myitschool/work/api/domain/useCases/employee/UpdateEmployeeUseCase.java @@ -0,0 +1,21 @@ +package ru.myitschool.work.api.domain.useCases.employee; + +import androidx.annotation.NonNull; + +import java.util.function.Consumer; + +import ru.myitschool.work.api.data.dto.employee.EmployeeDTO; +import ru.myitschool.work.api.domain.EmployeeRepository; +import ru.myitschool.work.api.domain.entity.Status; + +public class UpdateEmployeeUseCase { + private final EmployeeRepository employeeRepository; + + public UpdateEmployeeUseCase(EmployeeRepository employeeRepository) { + this.employeeRepository = employeeRepository; + } + + public void execute(long id, @NonNull EmployeeDTO employeeDTO, @NonNull Consumer> callback) { + employeeRepository.updateEmployee(id, employeeDTO, callback); + } +} diff --git a/app/src/main/java/ru/myitschool/work/api/domain/useCases/office/GetAllOficiesUseCase.java b/app/src/main/java/ru/myitschool/work/api/domain/useCases/office/GetAllOficiesUseCase.java new file mode 100644 index 0000000..5ca4880 --- /dev/null +++ b/app/src/main/java/ru/myitschool/work/api/domain/useCases/office/GetAllOficiesUseCase.java @@ -0,0 +1,22 @@ +package ru.myitschool.work.api.domain.useCases.office; + +import androidx.annotation.NonNull; + +import java.util.List; +import java.util.function.Consumer; + +import ru.myitschool.work.api.domain.OfficeRepository; +import ru.myitschool.work.api.domain.entity.Status; +import ru.myitschool.work.api.domain.entity.office.OfficeEntity; + +public class GetAllOficiesUseCase { + private final OfficeRepository officeRepository; + + public GetAllOficiesUseCase(OfficeRepository officeRepository) { + this.officeRepository = officeRepository; + } + + public void execute(@NonNull Consumer>> callback) { + officeRepository.getAllOffices(callback); + } +} diff --git a/app/src/main/java/ru/myitschool/work/api/domain/useCases/sign/CreateEmployeeUseCase.java b/app/src/main/java/ru/myitschool/work/api/domain/useCases/sign/CreateEmployeeUseCase.java new file mode 100644 index 0000000..65eabd3 --- /dev/null +++ b/app/src/main/java/ru/myitschool/work/api/domain/useCases/sign/CreateEmployeeUseCase.java @@ -0,0 +1,22 @@ +package ru.myitschool.work.api.domain.useCases.sign; + +import androidx.annotation.NonNull; + +import java.util.function.Consumer; + +import ru.myitschool.work.api.data.dto.employee.EmployeeCreateDTO; +import ru.myitschool.work.api.domain.SignRepository; +import ru.myitschool.work.api.domain.entity.Status; +import ru.myitschool.work.api.domain.entity.employee.EmpolyeeEntity; + +public class CreateEmployeeUseCase { + private final SignRepository signRepository; + + public CreateEmployeeUseCase(SignRepository signRepository) { + this.signRepository = signRepository; + } + + public void execute(@NonNull EmployeeCreateDTO employeeRegisterDTO, Consumer> callback) { + signRepository.createEmployee(employeeRegisterDTO, callback); + } +} diff --git a/app/src/main/java/ru/myitschool/work/api/domain/useCases/sign/LoginEmployeeUseCase.java b/app/src/main/java/ru/myitschool/work/api/domain/useCases/sign/LoginEmployeeUseCase.java new file mode 100644 index 0000000..7844eee --- /dev/null +++ b/app/src/main/java/ru/myitschool/work/api/domain/useCases/sign/LoginEmployeeUseCase.java @@ -0,0 +1,24 @@ +package ru.myitschool.work.api.domain.useCases.sign; + +import androidx.annotation.NonNull; + +import java.util.function.Consumer; + +import ru.myitschool.work.api.domain.SignRepository; +import ru.myitschool.work.api.domain.entity.Status; +import ru.myitschool.work.api.domain.entity.employee.EmpolyeeEntity; + +public class LoginEmployeeUseCase { + private final SignRepository signRepository; + + public LoginEmployeeUseCase(SignRepository signRepository) { + this.signRepository = signRepository; + } + + public void execute(@NonNull String email, @NonNull String password, Consumer> callback) { + signRepository.login(email, password, employeeEntityStatus -> { + //if (employeeEntityStatus.getStatusCode() != 200) signRepository.logout(); + callback.accept(employeeEntityStatus); + }); + } +} diff --git a/app/src/main/java/ru/myitschool/work/api/entity/Code.java b/app/src/main/java/ru/myitschool/work/api/entity/Code.java deleted file mode 100644 index 2337457..0000000 --- a/app/src/main/java/ru/myitschool/work/api/entity/Code.java +++ /dev/null @@ -1,14 +0,0 @@ -package ru.myitschool.work.api.entity; - -import kotlinx.serialization.Serializable; - -@Serializable -public class Code { - private long value; - - public Code() { } - public Code(long value) { this.value = value;} - - public long getValue() { return value; } - public void setValue(long value) { this.value = value; } -} \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/api/entity/Employee.java b/app/src/main/java/ru/myitschool/work/api/entity/Employee.java deleted file mode 100644 index e124c36..0000000 --- a/app/src/main/java/ru/myitschool/work/api/entity/Employee.java +++ /dev/null @@ -1,87 +0,0 @@ -package ru.myitschool.work.api.entity; - -import androidx.annotation.NonNull; - -import kotlinx.serialization.Serializable; - - -@Serializable -public class Employee { - private long id; - private String login; - private String name; - private String photo; - private String position; - private String lastVisit; - - public Employee() { - } - - public Employee(long id, String login, String name, String photo, String position, String lastVisit) { - this.id = id; - this.login = login; - this.name = name; - this.photo = photo; - this.position = position; - this.lastVisit = lastVisit; - } - - @NonNull - @Override - public String toString() { - return "id: " + id + - ", login: " + login + - ", name: " + name + - ", photo: " + photo + - ", position: " + position + - ", lastVisit: " + lastVisit; - } - - public long getId() { - return id; - } - - public void setId(long id) { - this.id = id; - } - - public String getLogin() { - return login; - } - - public void setLogin(String login) { - this.login = login; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getPhoto() { - return photo; - } - - public void setPhoto(String photo) { - this.photo = photo; - } - - public String getPosition() { - return position; - } - - public void setPosition(String position) { - this.position = position; - } - - public String getLastVisit() { - return lastVisit; - } - - public void setLastVisit(String lastVisit) { - this.lastVisit = lastVisit; - } -} \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/core/BundleConstants.kt b/app/src/main/java/ru/myitschool/work/core/BundleConstants.kt new file mode 100644 index 0000000..089b5f3 --- /dev/null +++ b/app/src/main/java/ru/myitschool/work/core/BundleConstants.kt @@ -0,0 +1,7 @@ +package com.example.myapplication.core + +object BundleConstants { + const val EVENT_ID: String = "eventId" + const val EVENT_COORDINATES: String = "coordinate" + const val VOLUNTEER_ID: String = "volunteerId" +} \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/core/Constants.kt b/app/src/main/java/ru/myitschool/work/core/Constants.kt deleted file mode 100644 index 074c3ea..0000000 --- a/app/src/main/java/ru/myitschool/work/core/Constants.kt +++ /dev/null @@ -1,6 +0,0 @@ -package ru.myitschool.work.core -// БЕРИТЕ И ИЗМЕНЯЙТЕ ХОСТ ТОЛЬКО ЗДЕСЬ И НЕ БЕРИТЕ ИЗ ДРУГИХ МЕСТ. ФАЙЛ ПЕРЕМЕЩАТЬ НЕЛЬЗЯ -object Constants { - // const val SERVER_ADDRESS = "http://localhost:8090" - const val SERVER_ADDRESS = "http://192.168.0.105:8080" -} \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/core/MyConstants.kt b/app/src/main/java/ru/myitschool/work/core/MyConstants.kt deleted file mode 100644 index c7015b1..0000000 --- a/app/src/main/java/ru/myitschool/work/core/MyConstants.kt +++ /dev/null @@ -1,7 +0,0 @@ -package ru.myitschool.work.core - -object MyConstants { - const val PREFS_FILE: String = "account" - const val PREF_LOGIN: String = "login" - val DEF_VALUE: Nothing? = null -} \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/core/RoleConstants.kt b/app/src/main/java/ru/myitschool/work/core/RoleConstants.kt new file mode 100644 index 0000000..a4adb4d --- /dev/null +++ b/app/src/main/java/ru/myitschool/work/core/RoleConstants.kt @@ -0,0 +1,7 @@ +package com.example.myapplication.core + +object RoleConstants { + const val ROLE_USER: String = "ROLE_USER" + const val ROLE_ADMIN: String = "ROLE_ADMIN" + const val ROLE_GUEST: String = "ROLE_GUEST" +} \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/core/SettingConstants.kt b/app/src/main/java/ru/myitschool/work/core/SettingConstants.kt new file mode 100644 index 0000000..a7673bd --- /dev/null +++ b/app/src/main/java/ru/myitschool/work/core/SettingConstants.kt @@ -0,0 +1,10 @@ +package com.example.myapplication.core + +object SettingConstants { + // Для сохранения факта входа в систему. + const val PREFS_FILE: String = "account" + const val PREF_ID: String = "id" + const val PREF_ROLE: String = "role" + const val ERROR_ID: Long = 1.unaryMinus() + val DEF_VALUE: Nothing? = null +} diff --git a/app/src/main/java/ru/myitschool/work/core/UrlConstants.kt b/app/src/main/java/ru/myitschool/work/core/UrlConstants.kt new file mode 100644 index 0000000..ec03aab --- /dev/null +++ b/app/src/main/java/ru/myitschool/work/core/UrlConstants.kt @@ -0,0 +1,7 @@ +package com.example.myapplication.core + +object UrlConstants { + // url для эмулятора http://10.0.2.2:8080/ + const val BASE_URL: String = "http://192.168.0.105:8080" + const val DOWNLOAD_URL: String = "$BASE_URL/api/v1/images/" +} \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/ui/RootActivity.kt b/app/src/main/java/ru/myitschool/work/ui/RootActivity.kt deleted file mode 100644 index d144f28..0000000 --- a/app/src/main/java/ru/myitschool/work/ui/RootActivity.kt +++ /dev/null @@ -1,66 +0,0 @@ -package ru.myitschool.work.ui - -import ru.myitschool.work.ui.result.ResultFragment -import android.os.Bundle -import android.util.Log -import androidx.activity.OnBackPressedCallback -import androidx.appcompat.app.AppCompatActivity -import androidx.navigation.createGraph -import androidx.navigation.findNavController -import androidx.navigation.fragment.NavHostFragment -import androidx.navigation.fragment.fragment -import dagger.hilt.android.AndroidEntryPoint -import ru.myitschool.work.R -import ru.myitschool.work.ui.login.LoginDestination -import ru.myitschool.work.ui.login.LoginFragment -import ru.myitschool.work.ui.main.MainDestination -import ru.myitschool.work.ui.main.MainFragment -import ru.myitschool.work.ui.qr.scan.QrScanDestination -import ru.myitschool.work.ui.qr.scan.QrScanFragment -import ru.myitschool.work.ui.result.ResultDestination - -// НЕ ИЗМЕНЯЙТЕ НАЗВАНИЕ КЛАССА! -@AndroidEntryPoint -class RootActivity : AppCompatActivity() { - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(R.layout.activity_root) - - val navHostFragment = supportFragmentManager - .findFragmentById(R.id.nav_host_fragment) as NavHostFragment? - - if (navHostFragment != null) { - val navController = navHostFragment.navController - navController.graph = navController.createGraph( - startDestination = MainDestination - ) { - fragment() - fragment() - fragment() - fragment() - } - } - - - onBackPressedDispatcher.addCallback( - this, - object : OnBackPressedCallback(true) { - override fun handleOnBackPressed() { - onSupportNavigateUp() - } - } - ) - } - - override fun onSupportNavigateUp(): Boolean { - Log.d("Test", "(RootActivity) Сработал метод, отвечающий за кнопку назад.") - - val navController = findNavController(R.id.nav_host_fragment) - val popBackResult = if (navController.previousBackStackEntry != null) { - navController.popBackStack() - } else { - false - } - return popBackResult || super.onSupportNavigateUp() - } -} \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/ui/login/LoginDestination.kt b/app/src/main/java/ru/myitschool/work/ui/login/LoginDestination.kt deleted file mode 100644 index 50acfb0..0000000 --- a/app/src/main/java/ru/myitschool/work/ui/login/LoginDestination.kt +++ /dev/null @@ -1,6 +0,0 @@ -package ru.myitschool.work.ui.login - -import kotlinx.serialization.Serializable - -@Serializable -data object LoginDestination \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/ui/login/LoginFragment.kt b/app/src/main/java/ru/myitschool/work/ui/login/LoginFragment.kt deleted file mode 100644 index 0d53e26..0000000 --- a/app/src/main/java/ru/myitschool/work/ui/login/LoginFragment.kt +++ /dev/null @@ -1,122 +0,0 @@ -package ru.myitschool.work.ui.login - -import android.content.Context -import android.content.SharedPreferences -import android.os.Bundle -import android.text.Editable -import android.util.Log -import android.view.View -import android.widget.EditText -import androidx.fragment.app.Fragment -import androidx.fragment.app.viewModels -import androidx.navigation.fragment.findNavController -import dagger.hilt.android.AndroidEntryPoint -import ru.myitschool.work.R -import ru.myitschool.work.api.ControllerAPI -import ru.myitschool.work.api.HandlersResultAPI -import ru.myitschool.work.api.entity.Employee -import ru.myitschool.work.core.MyConstants -import ru.myitschool.work.databinding.FragmentLoginBinding -import java.util.regex.Pattern - -@AndroidEntryPoint -class LoginFragment : Fragment(R.layout.fragment_login), HandlersResultAPI { - private var _binding: FragmentLoginBinding? = null - private val binding: FragmentLoginBinding get() = _binding!! - - private val viewModel: LoginViewModel by viewModels() - - private var controllerAPI: ControllerAPI? = null // Работа с API - private var settings: SharedPreferences? = null // Настройки приложения. Нужны для сохранения логина при входе. - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - _binding = FragmentLoginBinding.bind(view) - - // ТЗ: - // >>> ✅ В пустом поле ввода должна отображаться подсказка, что требуется ввести пользователю. - // >>> ✅ Если хотя бы одно из условий ниже соблюдено - кнопка должна быть неактивной: - // ✅ Поле ввода пустое. - // ✅ Количество символов менее 3-х. - // ✅ Логин начинается с цифры. - // ✅ Логин содержит символы, отличные от латинского алфавита и цифр. - // >>> ✅ Поле ввода и кнопку должно быть видно при раскрытии клавиатуры. - // >>> ✅ При нажатии на кнопку входа необходимо проверить, что данный пользователь существует - // с помощью запроса api//auth. - // >>> ✅ В случае отсутствия логина или любой другой неполадки - необходимо вывести ошибку, - // пока пользователь не изменит текстовое поле или повторно не нажмёт на кнопку. - // >>> ✅ После нажатия на кнопку - логин должен быть сохранён и при следующем открытии - // приложения экран авторизации не должен быть показан. - // >>> ✅ После нажатия на кнопку - при нажатии стрелки назад - экран авторизации не - // должен быть показан повторно. - // >>> ✅ Экран авторизации показывается только в случае, если пользователь не авторизован. -// usernameEditText = findViewById(R.id.username) -// loginButton = findViewById