From 6b458a501b49c5bde25e586130f2575bfaba62bd Mon Sep 17 00:00:00 2001 From: Sam Bosley Date: Thu, 24 Jan 2013 18:40:33 -0800 Subject: [PATCH] Implemented create and delete member links for sync --- .../actfm/sync/messages/MakeChanges.java | 3 +- .../astrid/tags/TagMemberMetadata.java | 8 ++++ .../todoroo/astrid/dao/TagMetadataDao.java | 44 +++++++++++++++++-- 3 files changed, 50 insertions(+), 5 deletions(-) diff --git a/astrid/plugin-src/com/todoroo/astrid/actfm/sync/messages/MakeChanges.java b/astrid/plugin-src/com/todoroo/astrid/actfm/sync/messages/MakeChanges.java index 7470be2df..7c5ff3a6d 100644 --- a/astrid/plugin-src/com/todoroo/astrid/actfm/sync/messages/MakeChanges.java +++ b/astrid/plugin-src/com/todoroo/astrid/actfm/sync/messages/MakeChanges.java @@ -235,7 +235,6 @@ public class MakeChanges extends ServerToClientMessage boolean membersRemoved = (removeMembers != null && removeMembers.length() > 0); if (membersAdded) { - model.setValue(TagData.MEMBERS, ""); // Clear this value for migration purposes model.setValue(TagData.MEMBERS, ""); // Clear this value for migration purposes for (int i = 0; i < addMembers.length(); i++) { try { @@ -257,7 +256,7 @@ public class MakeChanges extends ServerToClientMessage // } } - tagMetadataDao.removeMemberLinks(uuid, toRemove.toArray(new String[toRemove.size()])); + tagMetadataDao.removeMemberLinks(uuid, toRemove.toArray(new String[toRemove.size()]), true); } } } diff --git a/astrid/plugin-src/com/todoroo/astrid/tags/TagMemberMetadata.java b/astrid/plugin-src/com/todoroo/astrid/tags/TagMemberMetadata.java index 09e39cf8a..854a779dd 100644 --- a/astrid/plugin-src/com/todoroo/astrid/tags/TagMemberMetadata.java +++ b/astrid/plugin-src/com/todoroo/astrid/tags/TagMemberMetadata.java @@ -9,4 +9,12 @@ public class TagMemberMetadata { public static final StringProperty USER_UUID = new StringProperty( TagMetadata.TABLE, TagMetadata.VALUE1.name); + + public static TagMetadata newMemberMetadata(String tagUuid, String userUuid) { + TagMetadata m = new TagMetadata(); + m.setValue(TagMetadata.TAG_UUID, tagUuid); + m.setValue(USER_UUID, userUuid); + m.setValue(TagMetadata.DELETION_DATE, 0L); + return m; + } } diff --git a/astrid/src/com/todoroo/astrid/dao/TagMetadataDao.java b/astrid/src/com/todoroo/astrid/dao/TagMetadataDao.java index 78e721e09..3974eda04 100644 --- a/astrid/src/com/todoroo/astrid/dao/TagMetadataDao.java +++ b/astrid/src/com/todoroo/astrid/dao/TagMetadataDao.java @@ -8,8 +8,12 @@ package com.todoroo.astrid.dao; import com.todoroo.andlib.data.DatabaseDao; import com.todoroo.andlib.service.Autowired; import com.todoroo.andlib.service.DependencyInjectionService; +import com.todoroo.andlib.sql.Criterion; +import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.astrid.data.Metadata; +import com.todoroo.astrid.data.SyncFlags; import com.todoroo.astrid.data.TagMetadata; +import com.todoroo.astrid.tags.TagMemberMetadata; /** * Data Access layer for {@link Metadata}-related operations. @@ -29,12 +33,46 @@ public class TagMetadataDao extends DatabaseDao { setDatabase(database); } + public static class TagMetadataCriteria { + /** Returns all metadata associated with a given task */ + public static Criterion byTag(String tagUuid) { + return TagMetadata.TAG_UUID.eq(tagUuid); + } + + /** Returns all metadata associated with a given key */ + public static Criterion withKey(String key) { + return TagMetadata.KEY.eq(key); + } + + /** Returns all metadata associated with a given key */ + public static Criterion byTagAndWithKey(String tagUuid, String key) { + return Criterion.and(withKey(key), byTag(tagUuid)); + } + } + public void createMemberLink(String tagUuid, String memberId) { - // TODO: Implement + TagMetadata newMetadata = TagMemberMetadata.newMemberMetadata(tagUuid, memberId); + if (update(Criterion.and(TagMetadataCriteria.byTagAndWithKey(tagUuid, TagMemberMetadata.KEY), + TagMemberMetadata.USER_UUID.eq(memberId)), newMetadata) <= 0) { + createNew(newMetadata); + } } - public void removeMemberLinks(String tagUuid, String[] memberIds) { - // TODO: Implement + public void removeMemberLinks(String tagUuid, String[] memberIds, boolean suppressOutstanding) { + TagMetadata deleteTemplate = new TagMetadata(); + deleteTemplate.setValue(TagMetadata.TAG_UUID, tagUuid); // Need this for recording changes in outstanding table + deleteTemplate.setValue(Metadata.DELETION_DATE, DateUtilities.now()); + if (memberIds != null) { + for (String uuid : memberIds) { + // TODO: Right now this is in a loop because each deleteTemplate needs the individual tagUuid in order to record + // the outstanding entry correctly. If possible, this should be improved to a single query + deleteTemplate.setValue(TagMemberMetadata.USER_UUID, uuid); // Need this for recording changes in outstanding table + if (suppressOutstanding) + deleteTemplate.putTransitory(SyncFlags.ACTFM_SUPPRESS_OUTSTANDING_ENTRIES, true); + update(Criterion.and(TagMetadataCriteria.withKey(TagMemberMetadata.KEY), Metadata.DELETION_DATE.eq(0), + TagMetadata.TAG_UUID.eq(tagUuid), TagMemberMetadata.USER_UUID.eq(uuid)), deleteTemplate); + } + } } }