diff options
Diffstat (limited to 'Firestore/Source/API/FIRCollectionReference.m')
-rw-r--r-- | Firestore/Source/API/FIRCollectionReference.m | 113 |
1 files changed, 113 insertions, 0 deletions
diff --git a/Firestore/Source/API/FIRCollectionReference.m b/Firestore/Source/API/FIRCollectionReference.m new file mode 100644 index 0000000..1ded4d2 --- /dev/null +++ b/Firestore/Source/API/FIRCollectionReference.m @@ -0,0 +1,113 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FIRCollectionReference.h" + +#import "FIRDocumentReference+Internal.h" +#import "FIRQuery+Internal.h" +#import "FIRQuery_Init.h" +#import "FSTAssert.h" +#import "FSTDocumentKey.h" +#import "FSTPath.h" +#import "FSTQuery.h" +#import "FSTUsageValidation.h" +#import "FSTUtil.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface FIRCollectionReference () +- (instancetype)initWithPath:(FSTResourcePath *)path + firestore:(FIRFirestore *)firestore NS_DESIGNATED_INITIALIZER; + +// Mark the super class designated initializer unavailable. +- (instancetype)initWithQuery:(FSTQuery *)query + firestore:(FIRFirestore *)firestore + __attribute__((unavailable("Use the initWithPath constructor of FIRCollectionReference."))); +@end + +@implementation FIRCollectionReference (Internal) ++ (instancetype)referenceWithPath:(FSTResourcePath *)path firestore:(FIRFirestore *)firestore { + return [[FIRCollectionReference alloc] initWithPath:path firestore:firestore]; +} +@end + +@implementation FIRCollectionReference + +- (instancetype)initWithPath:(FSTResourcePath *)path firestore:(FIRFirestore *)firestore { + if (path.length % 2 != 1) { + FSTThrowInvalidArgument( + @"Invalid collection reference. Collection references must have an odd " + "number of segments, but %@ has %d", + path.canonicalString, path.length); + } + self = [super initWithQuery:[FSTQuery queryWithPath:path] firestore:firestore]; + return self; +} + +// Override the designated initializer from the super class. +- (instancetype)initWithQuery:(FSTQuery *)query firestore:(FIRFirestore *)firestore { + FSTFail(@"Use FIRCollectionReference initWithPath: initializer."); +} + +- (NSString *)collectionID { + return [self.query.path lastSegment]; +} + +- (FIRDocumentReference *_Nullable)parent { + FSTResourcePath *parentPath = [self.query.path pathByRemovingLastSegment]; + if (parentPath.isEmpty) { + return nil; + } else { + FSTDocumentKey *key = [FSTDocumentKey keyWithPath:parentPath]; + return [FIRDocumentReference referenceWithKey:key firestore:self.firestore]; + } +} + +- (NSString *)path { + return [self.query.path canonicalString]; +} + +- (FIRDocumentReference *)documentWithPath:(NSString *)documentPath { + if (!documentPath) { + FSTThrowInvalidArgument(@"Document path cannot be nil."); + } + FSTResourcePath *subPath = [FSTResourcePath pathWithString:documentPath]; + FSTResourcePath *path = [self.query.path pathByAppendingPath:subPath]; + return [FIRDocumentReference referenceWithPath:path firestore:self.firestore]; +} + +- (FIRDocumentReference *)addDocumentWithData:(NSDictionary<NSString *, id> *)data { + return [self addDocumentWithData:data completion:nil]; +} + +- (FIRDocumentReference *)addDocumentWithData:(NSDictionary<NSString *, id> *)data + completion: + (nullable void (^)(NSError *_Nullable error))completion { + FIRDocumentReference *docRef = [self documentWithAutoID]; + [docRef setData:data completion:completion]; + return docRef; +} + +- (FIRDocumentReference *)documentWithAutoID { + NSString *autoID = [FSTUtil autoID]; + FSTDocumentKey *key = + [FSTDocumentKey keyWithPath:[self.query.path pathByAppendingSegment:autoID]]; + return [FIRDocumentReference referenceWithKey:key firestore:self.firestore]; +} + +@end + +NS_ASSUME_NONNULL_END |