-
Notifications
You must be signed in to change notification settings - Fork 5
Expand file tree
/
Copy pathMAPITransaction.m
More file actions
112 lines (95 loc) · 3.18 KB
/
MAPITransaction.m
File metadata and controls
112 lines (95 loc) · 3.18 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
//
// MAPIAction.m
// Mib.io
//
// Created by Ben Gotow on 10/16/12.
// Copyright (c) 2012 Foundry376. All rights reserved.
//
#import "MAPITransaction.h"
#import "MAPIClient.h"
#import "MModel.h"
@implementation MAPITransaction
+ (MAPITransaction *)transactionForPerforming:(MAPITransactionType)type of:(MModel*)object
{
MAPITransaction * t = [[MAPITransaction alloc] init];
[t setCallback: NULL];
[t setType: type];
[t setObject: object];
[t setRequestReturnsModel: YES];
if (type == TRANSACTION_DELETE) {
[t setRequestURL: [object resourcePath]];
[t setRequestMethod: @"DELETE"];
} else {
if ((type == TRANSACTION_SAVE) && ([object isUnsaved])) {
[t setRequestURL: [[object parent] resourcePath]];
[t setRequestMethod: @"POST"];
} else {
[t setRequestURL: [object resourcePath]];
[t setRequestMethod: @"PUT"];
}
}
return t;
}
+ (MAPITransaction *)transactionForMethod:(NSString*)method onPath:(NSString*)path
{
MAPITransaction * t = [[MAPITransaction alloc] init];
[t setCallback: NULL];
[t setType: TRANSACTION_CUSTOM];
[t setRequestURL: path];
[t setRequestMethod: method];
[t setRequestReturnsModel: YES];
return t;
}
- (id)initWithCoder:(NSCoder *)aDecoder
{
self = [super init];
if (self) {
_type = [aDecoder decodeIntForKey: @"type"];
_object = [aDecoder decodeObjectForKey: @"object"];
_requestURL = [aDecoder decodeObjectForKey: @"requestURL"];
_requestMethod = [aDecoder decodeObjectForKey: @"requestMethod"];
_requestReturnsModel = [aDecoder decodeBoolForKey: @"requestReturnsModel"];
_callback = NULL;
_started = NO;
}
return self;
}
- (void)encodeWithCoder:(NSCoder *)aCoder
{
[aCoder encodeObject:_object forKey:@"object"];
[aCoder encodeObject:_requestURL forKey: @"requestURL"];
[aCoder encodeObject:_requestMethod forKey: @"requestMethod"];
[aCoder encodeBool:_requestReturnsModel forKey:@"requestReturnsModel"];
[aCoder encodeInt:_type forKey:@"type"];
}
- (void)perform
{
_started = true;
Class expectation = NULL;
if (_requestReturnsModel)
expectation = [NSDictionary class];
[[MAPIClient shared] requestPath:_requestURL withMethod:_requestMethod withParameters:[_object resourceJSON] userTriggered:NO expectedClass:expectation success:^(id responseObject) {
if (_requestReturnsModel)
[self.object updateWithResourceJSON: responseObject];
[[MAPIClient shared] finishedAPITransaction:self withError: nil];
if (_callback)
_callback(YES);
} failure:^(NSError *err) {
[[MAPIClient shared] finishedAPITransaction:self withError: err];
_started = NO;
if (_callback)
_callback(NO);
}];
}
- (void)performDeferred
{
_started = YES;
[self performSelectorOnMainThread:@selector(perform) withObject:nil waitUntilDone:NO];
}
- (BOOL)isEqual:(id)other
{
if (([other isKindOfClass: [self class]]) && ([[other object] isEqual: [self object]]) && ([other started] == NO) && ([self started] == NO))
return YES;
return NO;
}
@end