From 4640163a599006e88f16b4811f53d66f6a18856d Mon Sep 17 00:00:00 2001 From: Jens Alfke Date: Thu, 24 Jan 2013 14:29:42 -0800 Subject: [PATCH] Updated doc ownership schema Only wikis, not pages, have owners/members. The member editing UI is still on pages for now, but controls access to the whole wiki. Pull replication now syncs all channels (["*"]). --- TouchWiki.xcodeproj/project.pbxproj | 2 ++ TouchWiki/PageController.m | 9 ++++----- TouchWiki/Wiki.h | 5 +++++ TouchWiki/Wiki.m | 29 +++++++++++++++++++++++++++-- TouchWiki/WikiItem.h | 7 +------ TouchWiki/WikiItem.m | 29 ++++------------------------- TouchWiki/WikiPage.h | 2 +- TouchWiki/WikiPage.m | 17 +++++++++++------ TouchWiki/WikiStore.h | 2 -- TouchWiki/WikiStore.m | 17 ----------------- 10 files changed, 55 insertions(+), 64 deletions(-) diff --git a/TouchWiki.xcodeproj/project.pbxproj b/TouchWiki.xcodeproj/project.pbxproj index 1eba628..5c0e92b 100644 --- a/TouchWiki.xcodeproj/project.pbxproj +++ b/TouchWiki.xcodeproj/project.pbxproj @@ -489,6 +489,7 @@ GCC_SYMBOLS_PRIVATE_EXTERN = NO; GCC_TREAT_WARNINGS_AS_ERRORS = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 6.0; @@ -514,6 +515,7 @@ GCC_C_LANGUAGE_STANDARD = gnu99; GCC_TREAT_WARNINGS_AS_ERRORS = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 6.0; diff --git a/TouchWiki/PageController.m b/TouchWiki/PageController.m index 5582f5f..739e521 100644 --- a/TouchWiki/PageController.m +++ b/TouchWiki/PageController.m @@ -109,8 +109,7 @@ - (void) syncManager: (SyncManager*)manager addedReplication: (TDReplication*)re if (replication.pull) { // Pull replication: Define the set of channels to sync replication.filter = @"sync_gateway/bychannel"; - NSArray* channels = _wikiStore.channelsToSync; - replication.query_params = @{@"channels": [channels componentsJoinedByString: @","]}; + replication.query_params = @{@"channels": @[@"*"]}; } else { // Push replication: Set filter to block pushing draft documents replication.filter = @"notDraft"; // defined in WikiStore.m @@ -193,8 +192,8 @@ - (void) loadContent { //FIX: Use a real template engine! replace(html, @"{{ACCESSCLASS}}", klass); - replace(html, @"{{OWNER}}", _page.owner_id); - replace(html, @"{{MEMBERS}}", [_page.members componentsJoinedByString: @", "]); + replace(html, @"{{OWNER}}", _page.wiki.owner_id); + replace(html, @"{{MEMBERS}}", [_page.wiki.members componentsJoinedByString: @", "]); if (_page.draft) { [html appendString: @"\n"]; @@ -380,7 +379,7 @@ - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)butto - (void) updateMembers: (NSArray*)members { members = [[NSOrderedSet orderedSetWithArray: members] array]; // Remove duplicates - _page.members = members; + _page.wiki.members = members; [_page.wiki addMembers: members]; } diff --git a/TouchWiki/Wiki.h b/TouchWiki/Wiki.h index 3029566..3a6f178 100644 --- a/TouchWiki/Wiki.h +++ b/TouchWiki/Wiki.h @@ -28,6 +28,11 @@ - (NSString*) docIDForPageWithTitle: (NSString*)title; +@property (readonly) NSString* owner_id; +@property (copy) NSArray* members; + +- (void) addMembers: (NSArray*)newMembers; + @end diff --git a/TouchWiki/Wiki.m b/TouchWiki/Wiki.m index 2ebf5d9..942b7fb 100644 --- a/TouchWiki/Wiki.m +++ b/TouchWiki/Wiki.m @@ -18,13 +18,14 @@ @implementation Wiki NSSet* _allPageTitles; } -@dynamic title, markdown, created_at, updated_at; +@dynamic title, markdown, created_at, updated_at, owner_id, members; - (id) initNewWithTitle: (NSString*)title inWikiStore: (WikiStore*)wikiStore { self = [super initWithNewDocumentInDatabase: wikiStore.database]; if (self) { - [self setType: @"wiki" owner: wikiStore.username]; + [self setupType: @"wiki"]; + [self setValue: wikiStore.username ofProperty: @"owner_id"]; self.title = title; } return self; @@ -90,4 +91,28 @@ - (void) observeValueForKeyPath:(NSString *)keyPath } +- (bool) editable { + NSString* username = self.wikiStore.username; + return [self.owner_id isEqualToString: username] || [self.members containsObject: username]; +} + + +- (bool) owned { + NSString* username = self.wikiStore.username; + return [self.owner_id isEqualToString: username]; +} + + +- (void) addMembers: (NSArray*)newMembers { + NSArray* oldMembers = self.members; + if (!oldMembers) { + self.members = newMembers; + return; + } + NSMutableOrderedSet* members = [NSMutableOrderedSet orderedSetWithArray: self.members]; + [members addObjectsFromArray: newMembers]; + self.members = members.array; +} + + @end diff --git a/TouchWiki/WikiItem.h b/TouchWiki/WikiItem.h index ee569d0..4c2feac 100644 --- a/TouchWiki/WikiItem.h +++ b/TouchWiki/WikiItem.h @@ -20,11 +20,6 @@ @property (strong) NSDate* created_at; @property (strong) NSDate* updated_at; -@property (readonly) NSString* owner_id; -@property (copy) NSArray* members; - -- (void) addMembers: (NSArray*)newMembers; - @property (readonly) bool editable; @property (readonly) bool owned; @@ -32,5 +27,5 @@ @interface WikiItem (Private) -- (void) setType: (NSString*)type owner: (NSString*)owner; +- (void) setupType: (NSString*)type; @end \ No newline at end of file diff --git a/TouchWiki/WikiItem.m b/TouchWiki/WikiItem.m index 5a9974a..672008e 100644 --- a/TouchWiki/WikiItem.m +++ b/TouchWiki/WikiItem.m @@ -10,15 +10,10 @@ #import "WikiStore.h" -@interface WikiItem () -@property (readwrite) NSString* owner_id; -@end - - @implementation WikiItem -@dynamic title, markdown, created_at, updated_at, owner_id, members; +@dynamic title, markdown, created_at, updated_at; - (id) initWithDocument: (TDDocument*)document { @@ -30,10 +25,8 @@ - (id) initWithDocument: (TDDocument*)document { } -- (void) setType: (NSString*)type owner: (NSString*)owner { - NSParameterAssert(owner.length > 0); +- (void) setupType: (NSString*)type { [self setValue: type ofProperty: @"type"]; - self.owner_id = owner; self.created_at = self.updated_at = [NSDate date]; } @@ -56,26 +49,12 @@ - (WikiStore*) wikiStore { - (bool) editable { - NSString* username = self.wikiStore.username; - return [self.owner_id isEqualToString: username] || [self.members containsObject: username]; + return false; // abstract } - (bool) owned { - NSString* username = self.wikiStore.username; - return [self.owner_id isEqualToString: username]; -} - - -- (void) addMembers: (NSArray*)newMembers { - NSArray* oldMembers = self.members; - if (!oldMembers) { - self.members = newMembers; - return; - } - NSMutableOrderedSet* members = [NSMutableOrderedSet orderedSetWithArray: self.members]; - [members addObjectsFromArray: newMembers]; - self.members = members.array; + return false; // abstract } diff --git a/TouchWiki/WikiPage.h b/TouchWiki/WikiPage.h index d3700ac..506f765 100644 --- a/TouchWiki/WikiPage.h +++ b/TouchWiki/WikiPage.h @@ -17,10 +17,10 @@ @property (readonly) Wiki* wiki; +// A document with this flag set will not be pushed to the server. */ @property bool draft; // Ephemeral properties: -//@property bool editing; @property NSRange selectedRange; + (bool) parseDocID: (NSString*)docID diff --git a/TouchWiki/WikiPage.m b/TouchWiki/WikiPage.m index 8ee6ac6..fb73c0a 100644 --- a/TouchWiki/WikiPage.m +++ b/TouchWiki/WikiPage.m @@ -11,11 +11,6 @@ #import "WikiStore.h" -@interface WikiPage () -@property (readwrite) NSString* owner_id; -@end - - @implementation WikiPage @@ -26,7 +21,7 @@ - (id) initNewWithTitle: (NSString*)title inWiki: (Wiki*)wiki { TDDocument* doc = [wiki.database documentWithID: [wiki docIDForPageWithTitle: title]]; self = [super initWithDocument: doc]; if (self) { - [self setType: @"page" owner: wiki.wikiStore.username]; + [self setupType: @"page"]; [self setValue: wiki.wikiID ofProperty: @"wiki_id"]; } return self; @@ -72,4 +67,14 @@ - (NSTimeInterval) autosaveDelay { } +- (bool) editable { + return self.wiki.editable; +} + + +- (bool) owned { + return self.wiki.owned; +} + + @end diff --git a/TouchWiki/WikiStore.h b/TouchWiki/WikiStore.h index 3c28d9f..b722c1a 100644 --- a/TouchWiki/WikiStore.h +++ b/TouchWiki/WikiStore.h @@ -32,6 +32,4 @@ @property (strong) NSString* username; -@property (strong) NSArray* channelsToSync; - @end diff --git a/TouchWiki/WikiStore.m b/TouchWiki/WikiStore.m index a397539..9a07e40 100644 --- a/TouchWiki/WikiStore.m +++ b/TouchWiki/WikiStore.m @@ -95,23 +95,6 @@ - (void) setUsername:(NSString *)username { } -- (NSArray*) channelsToSync { - //FIX: This would be better stored in a _local document in the database - NSArray* channels = [[NSUserDefaults standardUserDefaults] objectForKey: @"ChannelsToSync"]; - if (!channels) - channels = @[]; - NSString* username = self.username; - if (username && ![channels containsObject: username]) - channels = [channels arrayByAddingObject: username]; - return channels; -} - - -- (void) setChannelsToSync:(NSArray *)channelsToSync { - [[NSUserDefaults standardUserDefaults] setObject: channelsToSync forKey: @"ChannelsToSync"]; -} - - - (TDQuery*) queryPagesOfWiki: (Wiki*)wiki { TDQuery* query = [[_database viewNamed: @"pagesByTitle"] query]; query.startKey = @[wiki.wikiID];