Streamline SignalRecipient.

This commit is contained in:
Matthew Chen 2018-07-16 12:39:24 -04:00
parent 05a4222b2d
commit b6489c6948
4 changed files with 16 additions and 37 deletions

View File

@ -15,14 +15,10 @@ NS_ASSUME_NONNULL_BEGIN
+ (instancetype)selfRecipient; + (instancetype)selfRecipient;
+ (SignalRecipient *)ensureRecipientExistsWithRegisteredRecipientId:(NSString *)recipientId
transaction:(YapDatabaseReadWriteTransaction *)transaction;
+ (SignalRecipient *)ensureRecipientExistsWithRecipientId:(NSString *)recipientId
transaction:(YapDatabaseReadWriteTransaction *)transaction;
+ (nullable instancetype)registeredRecipientForRecipientId:(NSString *)recipientId + (nullable instancetype)registeredRecipientForRecipientId:(NSString *)recipientId
transaction:(YapDatabaseReadTransaction *)transaction; transaction:(YapDatabaseReadTransaction *)transaction;
+ (instancetype)getOrCreatedUnsavedRecipientForRecipientId:(NSString *)recipientId
transaction:(YapDatabaseReadTransaction *)transaction;
- (void)addDevices:(NSSet *)set; - (void)addDevices:(NSSet *)set;
- (void)removeDevices:(NSSet *)set; - (void)removeDevices:(NSSet *)set;

View File

@ -31,32 +31,19 @@ NS_ASSUME_NONNULL_BEGIN
[super removeWithTransaction:transaction]; [super removeWithTransaction:transaction];
} }
+ (SignalRecipient *)ensureRecipientExistsWithRegisteredRecipientId:(NSString *)recipientId + (instancetype)getOrCreatedUnsavedRecipientForRecipientId:(NSString *)recipientId
transaction:(YapDatabaseReadWriteTransaction *)transaction transaction:(YapDatabaseReadTransaction *)transaction
{ {
SignalRecipient *recipient = [self ensureRecipientExistsWithRecipientId:recipientId transaction:transaction]; OWSAssert(transaction);
if (recipient.mayBeUnregistered) { OWSAssert(recipientId.length > 0);
recipient.mayBeUnregistered = NO;
[recipient saveWithTransaction:transaction]; SignalRecipient *_Nullable recipient = [self registeredRecipientForRecipientId:recipientId transaction:transaction];
if (!recipient) {
recipient = [[self alloc] initWithTextSecureIdentifier:recipientId];
} }
return recipient; return recipient;
} }
+ (SignalRecipient *)ensureRecipientExistsWithRecipientId:(NSString *)recipientId
transaction:(YapDatabaseReadWriteTransaction *)transaction
{
SignalRecipient *_Nullable recipient = [self recipientForRecipientId:recipientId transaction:transaction];
if (recipient) {
return recipient;
}
DDLogDebug(@"%@ creating recipient: %@", self.logTag, recipientId);
recipient = [[self alloc] initWithTextSecureIdentifier:recipientId];
[recipient saveWithTransaction:transaction];
return recipient;
}
- (instancetype)initWithTextSecureIdentifier:(NSString *)textSecureIdentifier - (instancetype)initWithTextSecureIdentifier:(NSString *)textSecureIdentifier
{ {
self = [super initWithUniqueId:textSecureIdentifier]; self = [super initWithUniqueId:textSecureIdentifier];

View File

@ -39,9 +39,6 @@ NS_ASSUME_NONNULL_BEGIN
[thread saveWithTransaction:transaction]; [thread saveWithTransaction:transaction];
} }
// TODO: Do we need to _eagerly_ ensure a SignalRecipient instance exists?
[SignalRecipient ensureRecipientExistsWithRecipientId:contactId transaction:transaction];
return thread; return thread;
} }

View File

@ -454,8 +454,8 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException";
NSMutableArray<SignalRecipient *> *recipients = [NSMutableArray new]; NSMutableArray<SignalRecipient *> *recipients = [NSMutableArray new];
[self.dbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { [self.dbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) {
for (NSString *recipientId in recipientIds) { for (NSString *recipientId in recipientIds) {
SignalRecipient *recipient = SignalRecipient *recipient = [SignalRecipient getOrCreatedUnsavedRecipientForRecipientId:recipientId
[SignalRecipient ensureRecipientExistsWithRecipientId:recipientId transaction:transaction]; transaction:transaction];
[recipients addObject:recipient]; [recipients addObject:recipient];
} }
}]; }];
@ -555,11 +555,10 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException";
return; return;
} }
__block SignalRecipient *recipient; NSArray<SignalRecipient *> *recipients =
[self.dbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { [self signalRecipientsForRecipientIds:@[recipientContactId] message:message];
recipient = OWSAssert(recipients.count == 1);
[SignalRecipient ensureRecipientExistsWithRecipientId:recipientContactId transaction:transaction]; SignalRecipient *recipient = recipients.firstObject;
}];
if (!recipient) { if (!recipient) {
NSError *error = OWSErrorMakeFailedToSendOutgoingMessageError(); NSError *error = OWSErrorMakeFailedToSendOutgoingMessageError();