diff --git a/app/src/main/java/ru/myitschool/work/data/CallToConsumer.java b/app/src/main/java/ru/myitschool/work/data/CallToConsumer.java new file mode 100644 index 0000000..05a98d8 --- /dev/null +++ b/app/src/main/java/ru/myitschool/work/data/CallToConsumer.java @@ -0,0 +1,52 @@ +package ru.myitschool.work.data; + +import androidx.annotation.NonNull; + +import java.util.function.Consumer; + +import retrofit2.Call; +import retrofit2.Callback; +import retrofit2.Response; +import ru.myitschool.work.domain.entities.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 throwable) { + callback.accept( + new Status<>( + -1, + null, + throwable + ) + ); + } + + public interface Mapper { + DEST map(SOURCE source); + } +} diff --git a/app/src/main/java/ru/myitschool/work/data/UserResponseImpl.java b/app/src/main/java/ru/myitschool/work/data/UserResponseImpl.java new file mode 100644 index 0000000..a2bb26d --- /dev/null +++ b/app/src/main/java/ru/myitschool/work/data/UserResponseImpl.java @@ -0,0 +1,60 @@ +package ru.myitschool.work.data; + +import androidx.annotation.NonNull; +import androidx.camera.core.processing.SurfaceProcessorNode; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Consumer; + +import ru.myitschool.work.data.dto.HistoryDto; +import ru.myitschool.work.data.dto.UserDto; +import ru.myitschool.work.data.network.RetrofitFactory; +import ru.myitschool.work.data.source.CredentialsDataSource; +import ru.myitschool.work.data.source.UserApi; +import ru.myitschool.work.domain.entities.HistioryEntity; +import ru.myitschool.work.domain.entities.Status; +import ru.myitschool.work.domain.entities.UserEntity; + +public class UserResponseImpl { + + private static UserResponseImpl INSTANCE; + private UserApi userApi = RetrofitFactory.getInstance().getUserApi(); + private final CredentialsDataSource credentialsDataSource = CredentialsDataSource.getInstance(); + + private UserResponseImpl() {} + + public static synchronized UserResponseImpl getInstance() { + if (INSTANCE == null) { + INSTANCE = new UserResponseImpl(); + } + return INSTANCE; + } + + + public void getAllUsers(@NonNull Consumer>> callback) { + userApi.getAllUsers().enqueue(new CallToConsumer<>( + callback, + usersDto -> { + ArrayList result = new ArrayList<>(usersDto.size()); + for (UserDto user : usersDto) { + final String username = user.username; + final String photo = user.photo; + final Long lastVisit = user.lastVisit; + final Integer idUser = user.idUser; + final String position = user.position; + if (idUser != null && username != null) { + result.add(new UserEntity(username, photo, lastVisit, idUser, position)); + } + } + return result; + } + )); + + } + + + + + +} diff --git a/app/src/main/java/ru/myitschool/work/dto/HistoryDto.java b/app/src/main/java/ru/myitschool/work/data/dto/HistoryDto.java similarity index 92% rename from app/src/main/java/ru/myitschool/work/dto/HistoryDto.java rename to app/src/main/java/ru/myitschool/work/data/dto/HistoryDto.java index 7ae46a8..800c3fa 100644 --- a/app/src/main/java/ru/myitschool/work/dto/HistoryDto.java +++ b/app/src/main/java/ru/myitschool/work/data/dto/HistoryDto.java @@ -1,4 +1,4 @@ -package ru.myitschool.work.dto; +package ru.myitschool.work.data.dto; import androidx.annotation.Nullable; diff --git a/app/src/main/java/ru/myitschool/work/data/dto/ReaderDto.java b/app/src/main/java/ru/myitschool/work/data/dto/ReaderDto.java new file mode 100644 index 0000000..ff2f66c --- /dev/null +++ b/app/src/main/java/ru/myitschool/work/data/dto/ReaderDto.java @@ -0,0 +1,16 @@ +package ru.myitschool.work.data.dto; + +import androidx.annotation.Nullable; + +import com.google.gson.annotations.SerializedName; + +public class ReaderDto { + @Nullable + @SerializedName("idReader") + public Integer idReader; + + @Nullable + @SerializedName("typeReader") + public Integer typeReader; + +} diff --git a/app/src/main/java/ru/myitschool/work/dto/RoleDto.java b/app/src/main/java/ru/myitschool/work/data/dto/RoleDto.java similarity index 87% rename from app/src/main/java/ru/myitschool/work/dto/RoleDto.java rename to app/src/main/java/ru/myitschool/work/data/dto/RoleDto.java index 0f0cce5..c1f504d 100644 --- a/app/src/main/java/ru/myitschool/work/dto/RoleDto.java +++ b/app/src/main/java/ru/myitschool/work/data/dto/RoleDto.java @@ -1,4 +1,4 @@ -package ru.myitschool.work.dto; +package ru.myitschool.work.data.dto; import androidx.annotation.Nullable; diff --git a/app/src/main/java/ru/myitschool/work/dto/UserDto.java b/app/src/main/java/ru/myitschool/work/data/dto/UserDto.java similarity index 98% rename from app/src/main/java/ru/myitschool/work/dto/UserDto.java rename to app/src/main/java/ru/myitschool/work/data/dto/UserDto.java index 3caa535..1a4797b 100644 --- a/app/src/main/java/ru/myitschool/work/dto/UserDto.java +++ b/app/src/main/java/ru/myitschool/work/data/dto/UserDto.java @@ -1,4 +1,4 @@ -package ru.myitschool.work.dto; +package ru.myitschool.work.data.dto; import androidx.annotation.Nullable; diff --git a/app/src/main/java/ru/myitschool/work/data/network/RetrofitFactory.java b/app/src/main/java/ru/myitschool/work/data/network/RetrofitFactory.java new file mode 100644 index 0000000..dd97c0e --- /dev/null +++ b/app/src/main/java/ru/myitschool/work/data/network/RetrofitFactory.java @@ -0,0 +1,48 @@ +package ru.myitschool.work.data.network; + +import okhttp3.OkHttpClient; +import okhttp3.Request; +import retrofit2.Retrofit; +import retrofit2.converter.gson.GsonConverterFactory; +import ru.myitschool.work.data.source.CredentialsDataSource; +import ru.myitschool.work.data.source.UserApi; + +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); + } + + } + ); + + private final Retrofit retrofit = new Retrofit.Builder() + .baseUrl("http://10.0.2.2:8080/") + .client(client.build()) + .addConverterFactory(GsonConverterFactory.create()) + .build(); + + public UserApi getUserApi() { + return retrofit.create(UserApi.class); + } + } + diff --git a/app/src/main/java/ru/myitschool/work/data/source/CredentialsDataSource.java b/app/src/main/java/ru/myitschool/work/data/source/CredentialsDataSource.java new file mode 100644 index 0000000..b383a29 --- /dev/null +++ b/app/src/main/java/ru/myitschool/work/data/source/CredentialsDataSource.java @@ -0,0 +1,36 @@ +package ru.myitschool.work.data.source; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import okhttp3.Credentials; + +public class CredentialsDataSource { + private static CredentialsDataSource INSTANCE; + + private CredentialsDataSource() {} + + public static synchronized CredentialsDataSource getInstance() { + if (INSTANCE == null) { + INSTANCE = new CredentialsDataSource(); + } + return INSTANCE; + } + + @Nullable + private String authData = null; + + @Nullable + public String getAuthData() { + return authData; + } + + public void updateLogin(@NonNull String username, @NonNull String password) { + authData = Credentials.basic(username, password); + } + + public void logout() { + authData = null; + } +} + diff --git a/app/src/main/java/ru/myitschool/work/data/source/UserApi.java b/app/src/main/java/ru/myitschool/work/data/source/UserApi.java new file mode 100644 index 0000000..0854420 --- /dev/null +++ b/app/src/main/java/ru/myitschool/work/data/source/UserApi.java @@ -0,0 +1,29 @@ +package ru.myitschool.work.data.source; + +import java.util.List; + +import retrofit2.Call; +import retrofit2.http.Body; +import retrofit2.http.GET; +import retrofit2.http.POST; +import retrofit2.http.Path; +import ru.myitschool.work.data.dto.HistoryDto; +import ru.myitschool.work.data.dto.UserDto; +import ru.myitschool.work.ui.History; + + +public interface UserApi { + @GET("api/user") + Call> getAllUsers(); + @GET("api/user/{id}") + Call getUserById(@Path("id") Integer id); + @GET("api/user/username/{username}") + Call isUserExist(@Path("username") String username); + @GET("api/user/login") + Call login(); + @GET("api/history/user/{id}") + Call> getAllUserHistory(@Path("id") Integer id); + @GET("api/history/{id}") + Call getHistoryById(@Path("id") Integer id); + +} diff --git a/app/src/main/java/ru/myitschool/work/domain/entities/HistioryEntity.java b/app/src/main/java/ru/myitschool/work/domain/entities/HistioryEntity.java new file mode 100644 index 0000000..f56e7a6 --- /dev/null +++ b/app/src/main/java/ru/myitschool/work/domain/entities/HistioryEntity.java @@ -0,0 +1,81 @@ +package ru.myitschool.work.domain.entities; + +import androidx.annotation.Nullable; + +import com.google.gson.annotations.SerializedName; + +public class HistioryEntity { + @Nullable + @SerializedName("id") + public Integer id; + + @Nullable + public Integer getId() { + return id; + } + + public void setId(@Nullable Integer id) { + this.id = id; + } + + @Nullable + public Integer getIdUser() { + return idUser; + } + + public void setIdUser(@Nullable Integer idUser) { + this.idUser = idUser; + } + + @Nullable + public Long getTime() { + return time; + } + + public void setTime(@Nullable Long time) { + this.time = time; + } + + @Nullable + public String getNameReader() { + return nameReader; + } + + public void setNameReader(@Nullable String nameReader) { + this.nameReader = nameReader; + } + + @Nullable + public String getType() { + return type; + } + + public void setType(@Nullable String type) { + this.type = type; + } + + public HistioryEntity(@Nullable Integer id, @Nullable Integer idUser, @Nullable Long time, @Nullable String nameReader, @Nullable String type) { + this.id = id; + this.idUser = idUser; + this.time = time; + this.nameReader = nameReader; + this.type = type; + } + + @Nullable + @SerializedName("idUser") + public Integer idUser; + + @Nullable + @SerializedName("time") + public Long time; + + @Nullable + @SerializedName("nameReader") + public String nameReader; + + @Nullable + @SerializedName("type") + public String type; + +} diff --git a/app/src/main/java/ru/myitschool/work/domain/entities/RoleEntity.java b/app/src/main/java/ru/myitschool/work/domain/entities/RoleEntity.java new file mode 100644 index 0000000..b89d3e6 --- /dev/null +++ b/app/src/main/java/ru/myitschool/work/domain/entities/RoleEntity.java @@ -0,0 +1,37 @@ +package ru.myitschool.work.domain.entities; + +import androidx.annotation.Nullable; + +import com.google.gson.annotations.SerializedName; + +public class RoleEntity { + @Nullable + @SerializedName("idUser") + public Integer idUser; + + @Nullable + @SerializedName("status") + public int status; + + public RoleEntity(@Nullable Integer idUser, int status) { + this.idUser = idUser; + this.status = status; + } + + @Nullable + public Integer getIdUser() { + return idUser; + } + + public void setIdUser(@Nullable Integer idUser) { + this.idUser = idUser; + } + + public int getStatus() { + return status; + } + + public void setStatus(int status) { + this.status = status; + } +} diff --git a/app/src/main/java/ru/myitschool/work/domain/entities/Status.java b/app/src/main/java/ru/myitschool/work/domain/entities/Status.java new file mode 100644 index 0000000..fd2eac6 --- /dev/null +++ b/app/src/main/java/ru/myitschool/work/domain/entities/Status.java @@ -0,0 +1,33 @@ +package ru.myitschool.work.domain.entities; + +import androidx.annotation.Nullable; + +public class Status{ + private final int statusCode; + + @Nullable + private final T value; + + @Nullable + private final Throwable errors; + + public Status(int statusCode, @Nullable T value, @Nullable Throwable errors) { + this.statusCode = statusCode; + this.value = value; + this.errors = errors; + } + + public int getStatusCode() { + return statusCode; + } + + @Nullable + public T getValue() { + return value; + } + + @Nullable + public Throwable getErrors() { + return errors; + } +} diff --git a/app/src/main/java/ru/myitschool/work/domain/entities/UserEntity.java b/app/src/main/java/ru/myitschool/work/domain/entities/UserEntity.java new file mode 100644 index 0000000..ef049cb --- /dev/null +++ b/app/src/main/java/ru/myitschool/work/domain/entities/UserEntity.java @@ -0,0 +1,86 @@ +package ru.myitschool.work.domain.entities; + +import androidx.annotation.Nullable; + +import com.google.gson.annotations.SerializedName; + +public class UserEntity { + @Nullable + @SerializedName("username") + public String username; + + + @Nullable + @SerializedName("photo") + public String photo; + + @Nullable + @SerializedName("lastVisit") + public Long lastVisit; + + @Nullable + @SerializedName("idUser") + public Integer idUser; + + + @Nullable + @SerializedName("position") + public String position; + + public UserEntity(@Nullable String username, @Nullable String photo, @Nullable Long lastVisit, @Nullable Integer idUser, @Nullable String position) { + this.username = username; + this.photo = photo; + this.lastVisit = lastVisit; + this.idUser = idUser; + this.position = position; + } + + @Nullable + public String getPosition() { + return position; + } + + public void setPosition(@Nullable String position) { + this.position = position; + } + + @Nullable + public String getUsername() { + return username; + } + + public void setUsername(@Nullable String username) { + this.username = username; + } + + @Nullable + public String getPhoto() { + return photo; + } + + public void setPhoto(@Nullable String photo) { + this.photo = photo; + } + + @Nullable + public Long getLastVisit() { + return lastVisit; + } + + public void setLastVisit(@Nullable Long lastVisit) { + this.lastVisit = lastVisit; + } + + @Nullable + public Integer getIdUser() { + return idUser; + } + + public void setIdUser(@Nullable Integer idUser) { + this.idUser = idUser; + } + + + + +}