diff options
author | desperateCoder <echotodevnull@gmail.com> | 2019-10-20 01:40:49 +0300 |
---|---|---|
committer | desperateCoder <echotodevnull@gmail.com> | 2019-10-20 01:57:33 +0300 |
commit | 6a779b429ee8c5b7867d79727ed5d214d9a6bbaf (patch) | |
tree | ede309bf9b120d7c50eb85e175337be7d7a4a902 /app/src | |
parent | 6291c3321558582cfd7a85db6749bcd2b9b773ec (diff) |
#148: WIP: propagate ACL modifications to the server
Diffstat (limited to 'app/src')
8 files changed, 147 insertions, 13 deletions
diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/api/DeckAPI.java b/app/src/main/java/it/niedermann/nextcloud/deck/api/DeckAPI.java index d5d30478a..907f4ee3d 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/api/DeckAPI.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/api/DeckAPI.java @@ -4,6 +4,7 @@ package it.niedermann.nextcloud.deck.api; import java.util.List; import io.reactivex.Observable; +import it.niedermann.nextcloud.deck.model.AccessControl; import it.niedermann.nextcloud.deck.model.Attachment; import it.niedermann.nextcloud.deck.model.Board; import it.niedermann.nextcloud.deck.model.Card; @@ -132,4 +133,13 @@ public interface DeckAPI { @PUT("board/{boardId}/stacks/{stackId}/cards/{cardId}/attachments/{attachmentId}/restore") Observable<Attachment> restoreAttachment(@Path("boardId") long boardId, @Path("stackId") long stackId, @Path("cardId") long cardId, @Path("attachmentId") long attachmentId); + // ### ACL + @POST("board/{boardId}/acl") + Observable<AccessControl> createAccessControl(@Path("boardId") long boardId, @Body AccessControl acl); + + @PUT("board/{boardId}/acl/{aclId}") + Observable<AccessControl> updateAccessControl(@Path("boardId") long boardId, @Path("aclId") long aclId, @Body AccessControl acl); + + @DELETE("board/{boardId}/acl/{aclId}") + Observable<Void> deleteAccessControl(@Path("boardId") long boardId, @Path("aclId") long aclId, @Body AccessControl acl); } diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/model/AccessControl.java b/app/src/main/java/it/niedermann/nextcloud/deck/model/AccessControl.java index 5b4b2a749..f28258698 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/model/AccessControl.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/model/AccessControl.java @@ -5,6 +5,8 @@ import androidx.room.ForeignKey; import androidx.room.Ignore; import androidx.room.Index; +import com.google.gson.annotations.SerializedName; + import it.niedermann.nextcloud.deck.model.interfaces.AbstractRemoteEntity; @Entity(inheritSuperIndices = true, @@ -31,6 +33,7 @@ public class AccessControl extends AbstractRemoteEntity { private Long userId; @Ignore + @SerializedName("participant") private User user; public Long getType() { @@ -96,4 +99,56 @@ public class AccessControl extends AbstractRemoteEntity { public void setUser(User user) { this.user = user; } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + + AccessControl that = (AccessControl) o; + + if (owner != that.owner) return false; + if (permissionEdit != that.permissionEdit) return false; + if (permissionShare != that.permissionShare) return false; + if (permissionManage != that.permissionManage) return false; + if (type != null ? !type.equals(that.type) : that.type != null) return false; + if (boardId != null ? !boardId.equals(that.boardId) : that.boardId != null) return false; + if (userId != null ? !userId.equals(that.userId) : that.userId != null) return false; + return user != null ? user.equals(that.user) : that.user == null; + } + + @Override + public int hashCode() { + int result = super.hashCode(); + result = 31 * result + (type != null ? type.hashCode() : 0); + result = 31 * result + (boardId != null ? boardId.hashCode() : 0); + result = 31 * result + (owner ? 1 : 0); + result = 31 * result + (permissionEdit ? 1 : 0); + result = 31 * result + (permissionShare ? 1 : 0); + result = 31 * result + (permissionManage ? 1 : 0); + result = 31 * result + (userId != null ? userId.hashCode() : 0); + result = 31 * result + (user != null ? user.hashCode() : 0); + return result; + } + + @Override + public String toString() { + return "AccessControl{" + + "type=" + type + + ", boardId=" + boardId + + ", owner=" + owner + + ", permissionEdit=" + permissionEdit + + ", permissionShare=" + permissionShare + + ", permissionManage=" + permissionManage + + ", userId=" + userId + + ", user=" + user + + ", localId=" + localId + + ", accountId=" + accountId + + ", id=" + id + + ", status=" + status + + ", lastModified=" + lastModified + + ", lastModifiedLocal=" + lastModifiedLocal + + "} " + super.toString(); + } } diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/SyncManager.java b/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/SyncManager.java index 4a0e9e243..bb38977f1 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/SyncManager.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/SyncManager.java @@ -35,6 +35,7 @@ import it.niedermann.nextcloud.deck.persistence.sync.adapters.db.util.WrappedLiv import it.niedermann.nextcloud.deck.persistence.sync.helpers.DataPropagationHelper; import it.niedermann.nextcloud.deck.persistence.sync.helpers.SyncHelper; import it.niedermann.nextcloud.deck.persistence.sync.helpers.providers.AbstractSyncDataProvider; +import it.niedermann.nextcloud.deck.persistence.sync.helpers.providers.AccessControlDataProvider; import it.niedermann.nextcloud.deck.persistence.sync.helpers.providers.ActivityDataProvider; import it.niedermann.nextcloud.deck.persistence.sync.helpers.providers.BoardDataProvider; import it.niedermann.nextcloud.deck.persistence.sync.helpers.providers.CardDataProvider; @@ -233,7 +234,7 @@ public class SyncManager { }); } - public void updateBoard(FullBoard board) { + public LiveData<FullBoard> updateBoard(FullBoard board) { MutableLiveData<FullBoard> liveData = new MutableLiveData<>(); long accountId = board.getAccountId(); doAsync(() -> { @@ -245,6 +246,7 @@ public class SyncManager { } }); }); + return liveData; } public LiveData<List<FullStack>> getStacksForBoard(long accountId, long localBoardId) { @@ -255,9 +257,20 @@ public class SyncManager { return dataBaseAdapter.getStack(accountId, localStackId); } - public void createAccessControl(long accountId, AccessControl entity) { - // TODO - is... here... anything to do?... - doAsync(() -> dataBaseAdapter.createAccessControl(accountId, entity)); + public LiveData<AccessControl> createAccessControl(long accountId, AccessControl entity) { + MutableLiveData<AccessControl> liveData = new MutableLiveData<>(); + doAsync(() -> { + Account account = dataBaseAdapter.getAccountByIdDirectly(accountId); + FullBoard board = dataBaseAdapter.getFullBoardByLocalIdDirectly(accountId, entity.getBoardId()); + new DataPropagationHelper(serverAdapter, dataBaseAdapter).createEntity( + new AccessControlDataProvider(null, board, Collections.singletonList(entity)), entity, new IResponseCallback<AccessControl>(account) { + @Override + public void onResponse(AccessControl response) { + liveData.postValue(response); + } + }); + }); + return liveData; } public AccessControl getAccessControlByRemoteIdDirectly(long accountId, Long id) { @@ -268,10 +281,35 @@ public class SyncManager { return dataBaseAdapter.getAccessControlByLocalBoardId(accountId, id); } - public void updateAccessControl(AccessControl entity) { + public MutableLiveData<AccessControl> updateAccessControl(AccessControl entity) { + MutableLiveData<AccessControl> liveData = new MutableLiveData<>(); + doAsync(() -> { + Account account = dataBaseAdapter.getAccountByIdDirectly(entity.getAccountId()); + FullBoard board = dataBaseAdapter.getFullBoardByLocalIdDirectly(entity.getAccountId(), entity.getBoardId()); + new DataPropagationHelper(serverAdapter, dataBaseAdapter).updateEntity( + new AccessControlDataProvider(null, board, Collections.singletonList(entity)), entity, new IResponseCallback<AccessControl>(account) { + @Override + public void onResponse(AccessControl response) { + liveData.postValue(response); + } + }); + }); + return liveData; + } + public MutableLiveData<AccessControl> deleteAccessControl(AccessControl entity) { + MutableLiveData<AccessControl> liveData = new MutableLiveData<>(); doAsync(() -> { - dataBaseAdapter.updateAccessControl(entity, true); + Account account = dataBaseAdapter.getAccountByIdDirectly(entity.getAccountId()); + FullBoard board = dataBaseAdapter.getFullBoardByLocalIdDirectly(entity.getAccountId(), entity.getBoardId()); + new DataPropagationHelper(serverAdapter, dataBaseAdapter).deleteEntity( + new AccessControlDataProvider(null, board, Collections.singletonList(entity)), entity, new IResponseCallback<AccessControl>(account) { + @Override + public void onResponse(AccessControl response) { + liveData.postValue(response); + } + }); }); + return liveData; } public LiveData<FullBoard> getFullBoardById(Long accountId, Long localId) { diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/adapters/ServerAdapter.java b/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/adapters/ServerAdapter.java index 95fe0ef47..45e007559 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/adapters/ServerAdapter.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/adapters/ServerAdapter.java @@ -27,6 +27,7 @@ import it.niedermann.nextcloud.deck.api.IResponseCallback; import it.niedermann.nextcloud.deck.api.LastSyncUtil; import it.niedermann.nextcloud.deck.api.RequestHelper; import it.niedermann.nextcloud.deck.exceptions.OfflineException; +import it.niedermann.nextcloud.deck.model.AccessControl; import it.niedermann.nextcloud.deck.model.Board; import it.niedermann.nextcloud.deck.model.Card; import it.niedermann.nextcloud.deck.model.Label; @@ -150,6 +151,7 @@ public class ServerAdapter { RequestHelper.request(sourceActivity, provider, () -> provider.getDeckAPI().createBoard(board), responseCallback); } + public void deleteBoard(Board board, IResponseCallback<Void> responseCallback) { ensureInternetConnection(); RequestHelper.request(sourceActivity, provider, () -> provider.getDeckAPI().deleteBoard(board.getId()), responseCallback); @@ -161,6 +163,21 @@ public class ServerAdapter { } + public void createAccessControl(long remoteBoardId, AccessControl acl, IResponseCallback<AccessControl> responseCallback) { + ensureInternetConnection(); + RequestHelper.request(sourceActivity, provider, () -> provider.getDeckAPI().createAccessControl(remoteBoardId, acl), responseCallback); + } + + public void updateAccessControl(long remoteBoardId, AccessControl acl, IResponseCallback<AccessControl> responseCallback) { + ensureInternetConnection(); + RequestHelper.request(sourceActivity, provider, () -> provider.getDeckAPI().updateAccessControl(remoteBoardId, acl.getId(), acl), responseCallback); + } + + public void deleteAccessControl(long remoteBoardId, AccessControl acl, IResponseCallback<Void> responseCallback) { + ensureInternetConnection(); + RequestHelper.request(sourceActivity, provider, () -> provider.getDeckAPI().deleteAccessControl(remoteBoardId, acl.getId(), acl), responseCallback); + } + public void getStacks(long boardId, IResponseCallback<List<FullStack>> responseCallback) { ensureInternetConnection(); RequestHelper.request(sourceActivity, provider, () -> provider.getDeckAPI().getStacks(boardId, getLastSyncDateFormatted(responseCallback.getAccount().getId())), responseCallback); diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/adapters/db/DataBaseAdapter.java b/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/adapters/db/DataBaseAdapter.java index 655c83db7..ddfa06dfb 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/adapters/db/DataBaseAdapter.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/adapters/db/DataBaseAdapter.java @@ -406,6 +406,11 @@ public class DataBaseAdapter { db.getAccessControlDao().update(entity); } + public void deleteAccessControl(AccessControl entity, boolean setStatus) { + markAsEditedIfNeeded(entity, setStatus); + db.getAccessControlDao().update(entity); + } + public LiveData<FullBoard> getFullBoardById(Long accountId, Long localId) { return db.getBoardDao().getFullBoardById(accountId, localId); } @@ -570,4 +575,7 @@ public class DataBaseAdapter { db.getActivityDao().delete(activity); } + public List<AccessControl> getLocallyChangedAccessControl(long accountId, long boardId) { + return db.getAccessControlDao().getLocallyChangedAccessControl(accountId, boardId); + } } diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/adapters/db/dao/AccessControlDao.java b/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/adapters/db/dao/AccessControlDao.java index 4a42cf88b..928b8177c 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/adapters/db/dao/AccessControlDao.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/adapters/db/dao/AccessControlDao.java @@ -19,4 +19,7 @@ public interface AccessControlDao extends GenericDao<AccessControl> { @Query("SELECT * FROM AccessControl WHERE accountId = :accountId and id = :remoteId") AccessControl getAccessControlByRemoteIdDirectly(final long accountId, final long remoteId); + + @Query("SELECT * FROM AccessControl WHERE accountId = :accountId and boardId = :boardId and (status<>1 or id is null or lastModified <> lastModifiedLocal)") + List<AccessControl> getLocallyChangedAccessControl(long accountId, long boardId); }
\ No newline at end of file diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/helpers/providers/AccessControlDataProvider.java b/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/helpers/providers/AccessControlDataProvider.java index 6c4d30fee..7fa1ca914 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/helpers/providers/AccessControlDataProvider.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/helpers/providers/AccessControlDataProvider.java @@ -6,15 +6,18 @@ import java.util.List; import it.niedermann.nextcloud.deck.api.IResponseCallback; import it.niedermann.nextcloud.deck.model.AccessControl; import it.niedermann.nextcloud.deck.model.User; +import it.niedermann.nextcloud.deck.model.full.FullBoard; import it.niedermann.nextcloud.deck.persistence.sync.adapters.ServerAdapter; import it.niedermann.nextcloud.deck.persistence.sync.adapters.db.DataBaseAdapter; public class AccessControlDataProvider extends AbstractSyncDataProvider<AccessControl> { private List<AccessControl> acl; + private FullBoard board; - public AccessControlDataProvider(AbstractSyncDataProvider<?> parent, List<AccessControl> acl) { + public AccessControlDataProvider(AbstractSyncDataProvider<?> parent, FullBoard board, List<AccessControl> acl) { super(parent); + this.board = board; this.acl = acl; } @@ -59,26 +62,26 @@ public class AccessControlDataProvider extends AbstractSyncDataProvider<AccessCo @Override public void createOnServer(ServerAdapter serverAdapter, DataBaseAdapter dataBaseAdapter, long accountId, IResponseCallback<AccessControl> responder, AccessControl entity) { - //TODO: implement + serverAdapter.createAccessControl(board.getBoard().getId(), entity, responder); } @Override public void updateOnServer(ServerAdapter serverAdapter, DataBaseAdapter dataBaseAdapter, long accountId, IResponseCallback<AccessControl> callback, AccessControl entity) { - //TODO: implement + serverAdapter.updateAccessControl(board.getBoard().getId(), entity, callback); } @Override public void deleteInDB(DataBaseAdapter dataBaseAdapter, long accountId, AccessControl accessControl) { - //TODO: implement + dataBaseAdapter.deleteAccessControl(accessControl, true); } @Override public void deleteOnServer(ServerAdapter serverAdapter, long accountId, IResponseCallback<Void> callback, AccessControl entity, DataBaseAdapter dataBaseAdapter) { - //TODO: implement + serverAdapter.deleteAccessControl(board.getBoard().getId(), entity, callback); } @Override public List<AccessControl> getAllChangedFromDB(DataBaseAdapter dataBaseAdapter, long accountId, Date lastSync) { - return null; + return dataBaseAdapter.getLocallyChangedAccessControl(accountId, board.getId()); } } diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/helpers/providers/BoardDataProvider.java b/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/helpers/providers/BoardDataProvider.java index 561cc5dd9..d19c950ec 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/helpers/providers/BoardDataProvider.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/helpers/providers/BoardDataProvider.java @@ -77,7 +77,7 @@ public class BoardDataProvider extends AbstractSyncDataProvider<FullBoard> { for (AccessControl ac : acl){ ac.setBoardId(existingEntity.getLocalId()); } - syncHelper.doSyncFor(new AccessControlDataProvider(this, acl)); + syncHelper.doSyncFor(new AccessControlDataProvider(this, existingEntity, acl)); } if (entityFromServer.getStacks() != null && !entityFromServer.getStacks().isEmpty()){ |