Update/delete Nextcloud News feeds and folders when syncing
This commit is contained in:
parent
a9fc9799fc
commit
8a8e4394ce
@ -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();
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user