Update/delete Nextcloud News feeds and folders when syncing

This commit is contained in:
Shinokuni 2019-07-25 14:00:04 +02:00
parent a9fc9799fc
commit 8a8e4394ce
4 changed files with 56 additions and 21 deletions

View File

@ -17,12 +17,6 @@ public interface AccountDao {
@Query("Select * from Account")
LiveData<List<Account>> selectAll();
@Query("Select * from Account Where current_account = 1")
LiveData<Account> selectCurrentAccount();
@Query("Select * from Account Where id = :id")
Account selectById(int id);
@Insert
long insert(Account account);
@ -41,8 +35,8 @@ public interface AccountDao {
@Query("Update Account set current_account = 1 Where id = :accountId")
void setCurrentAccount(int accountId);
@Query("Select count(*) From Account Where account_type = :accounType")
Integer getAccountCountByType(int accounType);
@Query("Select count(*) From Account Where account_type = :accountType")
Integer getAccountCountByType(int accountType);
@Query("Select count(*) From Account")
Integer getAccountCount();

View File

@ -50,12 +50,12 @@ public interface FeedDao {
@Query("Update Feed set etag = :etag, last_modified = :lastModified Where id = :feedId")
void updateHeaders(String etag, String lastModified, int feedId);
@Query("Update Feed set folder_id = :folderId Where id = :feedId")
void updateFeedFolder(int feedId, Integer folderId);
@Query("Update Feed set name = :feedName, url = :feedUrl, folder_id = :folderId Where id = :feedId")
void updateFeedFields(int feedId, String feedName, String feedUrl, Integer folderId);
@Query("Update Feed set name = :name, folder_id = :folderId Where remoteId = :remoteFeedId And account_id = :accountId")
void updateNameAndFolder(int remoteFeedId, int accountId, String name, Integer folderId);
@Query("Update Feed set text_color = :textColor, background_color = :bgColor Where id = :feedId")
void updateColors(int feedId, int textColor, int bgColor);
@ -66,5 +66,11 @@ public interface FeedDao {
@Query("Select * From Feed Where id in (:ids)")
List<Feed> selectFromIdList(long[] ids);
@Query("Select remoteId From Feed Where account_id = :accountId")
List<Long> getFeedRemoteIdsOfAccount(int accountId);
@Query("Delete from Feed Where id in (:ids)")
void deleteByIds(List<Long> ids);
}

View File

@ -29,15 +29,24 @@ public interface FolderDao {
@Update
void update(Folder folder);
@Query("Update Folder set name = :name Where remoteId = :remoteFolderId And account_id = :accountId")
void updateName(int remoteFolderId, int accountId, String name);
@Delete
void delete(Folder folder);
@Query("Select id From Folder Where remoteId = :remoteId And account_id = :accountId")
int getRemoteFolderLocalId(int remoteId, int accountId);
@Query("Select case When :remoteId In (Select remoteId From Folder) And :accountId In (Select account_id From Folder)Then 1 else 0 end")
@Query("Select case When :remoteId In (Select remoteId From Folder Where account_id = :accountId) Then 1 else 0 end")
boolean remoteFolderExists(int remoteId, int accountId);
@Query("Select * from Folder Where id = :folderId")
Folder select(int folderId);
@Query("Select remoteId From Folder Where account_id = :accountId")
List<Long> getFolderRemoteIdsOfAccount(int accountId);
@Query("Delete From Folder Where id in (:ids)")
void deleteByIds(List<Long> ids);
}

View File

@ -104,7 +104,7 @@ public class NextNewsRepository extends ARepository {
} else
emitter.onError(new Throwable());
} catch (IOException e) {
} catch (Exception e) {
e.printStackTrace();
emitter.onError(e);
}
@ -263,10 +263,13 @@ public class NextNewsRepository extends ARepository {
private List<Feed> insertFeeds(List<NextNewsFeed> feeds, Account account) {
List<Feed> newFeeds = new ArrayList<>();
// get remote feeds ids in local
List<Long> accountFeedIds = database.feedDao().getFeedRemoteIdsOfAccount(account.getId());
for (NextNewsFeed nextNewsFeed : feeds) {
Feed feed = FeedMatcher.nextNewsFeedToFeed(nextNewsFeed, account);
if (!database.feedDao().remoteFeedExists(nextNewsFeed.getId(), account.getId())) {
Feed feed = FeedMatcher.nextNewsFeedToFeed(nextNewsFeed, account);
// if the Nextcloud feed has a folder, it is already inserted, so we have to get its local id
if (nextNewsFeed.getFolderId() != 0) {
@ -278,13 +281,28 @@ public class NextNewsRepository extends ARepository {
feed.setFolderId(null);
newFeeds.add(feed);
} else { // update feed
Integer folderId = nextNewsFeed.getId() == 0 ? null :
database.folderDao().getRemoteFolderLocalId(nextNewsFeed.getFolderId(), account.getId());
database.feedDao().updateNameAndFolder(nextNewsFeed.getId(), account.getId(),
nextNewsFeed.getTitle(), folderId);
accountFeedIds.remove((long) nextNewsFeed.getId()); // the feeds exists in the server, so no need to keep its id
}
}
long[] ids = database.feedDao().insert(newFeeds);
// delete all feeds which were not returned by the server, so which do not exist in it
if (!accountFeedIds.isEmpty())
database.feedDao().deleteByIds(accountFeedIds);
List<Feed> insertedFeeds = new ArrayList<>();
if (!newFeeds.isEmpty()) {
long[] newFeedIds = database.feedDao().insert(newFeeds);
insertedFeeds.addAll(database.feedDao().selectFromIdList(newFeedIds));
setFaviconUtils(insertedFeeds);
}
List<Feed> insertedFeeds = database.feedDao().selectFromIdList(ids);
setFaviconUtils(insertedFeeds);
return insertedFeeds;
}
@ -292,6 +310,8 @@ public class NextNewsRepository extends ARepository {
private void insertFolders(List<NextNewsFolder> folders, Account account) {
List<Folder> newFolders = new ArrayList<>();
List<Long> accountFolderIds = database.folderDao().getFolderRemoteIdsOfAccount(account.getId());
for (NextNewsFolder nextNewsFolder : folders) {
if (!database.folderDao().remoteFolderExists(nextNewsFolder.getId(), account.getId())) {
@ -300,27 +320,33 @@ public class NextNewsRepository extends ARepository {
folder.setAccountId(account.getId());
newFolders.add(folder);
} else {
database.folderDao().updateName(nextNewsFolder.getId(), account.getId(),
nextNewsFolder.getName());
accountFolderIds.remove((long) nextNewsFolder.getId());
}
}
database.folderDao().insert(newFolders);
if (!accountFolderIds.isEmpty())
database.folderDao().deleteByIds(accountFolderIds);
if (!newFolders.isEmpty())
database.folderDao().insert(newFolders);
}
private void insertItems(List<NextNewsItem> items, Account account, boolean initialSync) {
List<Item> newItems = new ArrayList<>();
for (NextNewsItem nextNewsItem : items) {
Feed feed = database.feedDao().getFeedByRemoteId(nextNewsItem.getFeedId(), account.getId());
if (!initialSync && feed != null) {
if (database.itemDao().remoteItemExists(nextNewsItem.getId(), feed.getId()))
break;
}
Item item = ItemMatcher.nextNewsItemToItem(nextNewsItem, feed);
item.setReadTime(Utils.readTimeFromString(item.getContent()));
newItems.add(item);