-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathBikeMapper.cls
More file actions
156 lines (120 loc) · 4.52 KB
/
BikeMapper.cls
File metadata and controls
156 lines (120 loc) · 4.52 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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
public with sharing class BikeMapper {
public BikeMapper() {}
public Bicycle saveBike(Bicycle bikeInput) {
// here we'll map from apex object to sObjects.
Bicycle__c bike = new Bicycle__c();
bike.Id = bikeInput.id;
if (String.isNotBlank(bikeInput.name)) {
bike.Name = bikeInput.name;
}
upsert bike;
Frame__c bikeFrame = new Frame__c();
bikeFrame.Id = bikeInput.bikeFrame.id;
bikeFrame.Bicycle__c = bike.Id;
if (bikeInput.bikeFrame.height != null) {
bikeFrame.Height__c = bikeInput.bikeFrame.height;
}
if (bikeInput.bikeFrame.width != null) {
bikeFrame.Width__c = bikeInput.bikeFrame.width;
}
upsert bikeFrame;
List<Wheel__c> wheels = new List<Wheel__c>();
for (Wheel w : bikeInput.wheels) {
Wheel__c wheel = new Wheel__c();
wheel.Id = w.id;
wheel.bikeId = bike.Id;
if (w.radius != null) {
wheel.Radius__c = w.radius;
}
wheels.add(wheel);
}
upsert wheels;
List<Reflector__c> reflectors = new List<Reflector__c>();
Integer wheelIdx = 0;
for (Wheel__c wheel : wheels) {
Wheel w = bikeInput.wheels.get(wheelIdx);
for (Reflector r : w.reflectors) {
Reflector__c refl = new Reflector__c();
refl.Id = r.id;
refl.Wheel__c = wheel.Id;
if (String.isNotBlank(r.color)) {
refl.Color__c = r.color;
}
if (r.width != null) {
refl.Width__c = r.width;
}
reflectors.add(refl);
}
}
upsert reflectors;
return getBike(bike.Id);
}
public Bicycle getBike(Id bikeId) {
Bicyle__c bikeRecord = [
SELECT
Id,
Name,
(
SELECT
Id,
Height__c,
Width__c
FROM Frames__r
),
(
SELECT
Id,
Radius__c
FROM Wheels__r
)
FROM Bicycle__c
WHERE Id = :bikeId
];
Set<Id> wheelIds = new Set<Id>();
for (Wheel__c wheel : bikeRecord.Wheels__r) {
wheelIds.add(wheel.Id);
}
List<Reflector__c> reflectors = [
SELECT
Id,
Color__c,
Width__c,
Wheel__c
FROM Reflector__c
WHERE Id IN :wheelIds
];
Map<Id, <List>Reflector__c>> wheelToReflectorMap = new Map<Id, List<Reflector__c>>();
for (Reflector__c r : reflectors) {
if (!wheelToReflectorMap.contains(r.Wheel__c)) {
wheelToReflectorMap.put(r.Wheel__c, new List<Reflector__c>());
}
wheelToReflectorMap.get(r.Wheel__c).add(r);
}
// send the records to the mapper method
Bicycle bike = mapToApex(bikeRecord, wheelToReflectorMap);
return bike;
}
private Bicycle mapToApex(Bicycle bikeRecord, Map<Id, List<Reflector__c>> reflectorRecords) {
// this method maps the sobject fields to our apex object properties
Bicycle bike = new Bicycle();
bike.bikeFrame = new Frame();
bike.wheels = new List<Wheel>();
bike.bikeFrame.height = bikeRecord.Height__c;
bike.bikeFrame.width = bikeRecord.Width__c;
for (Wheel__c wheel : bikeRecord.Wheels__r) {
Wheel w = new Wheel();
w.id = wheel.Id;
w.radius = wheel.Radius__c;
w.reflectors = new List<Reflector>();
for (Reflector__c r : reflectorRecords.get(wheel.Id)) {
Reflector reflector = new Reflector();
reflector.id = r.Id;
reflector.color = r.Color__c;
reflector.width = r.Width__c;
w.reflectors.add(reflector);
}
bike.wheels.add(w);
}
return bike;
}
}