Skip to content

Commit 93e107d

Browse files
authored
Merge pull request #4 from mmadariaga/goroutines
Add goroutines
2 parents aee0ce7 + f76cced commit 93e107d

File tree

7 files changed

+259
-29
lines changed

7 files changed

+259
-29
lines changed

coverage/coverage.html

Lines changed: 114 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -144,33 +144,87 @@
144144
<pre class="file" id="file2" style="display: none">package domain_service
145145

146146
import (
147+
"sync"
148+
147149
domain_model "github.com/mmadariaga/go-api/internal/domain/model"
148150
)
149151

150152
type GetDriversByRaceDependencies interface {
151153
FetchDriversByRace(raceId int) ([]domain_model.Driver, error)
152154
}
153155

156+
type fetchDriversResponse struct {
157+
raceId int
158+
response []domain_model.Driver
159+
error error
160+
}
161+
154162
func GetDriversByRace(races []domain_model.Race, dependencies GetDriversByRaceDependencies) (map[int][]domain_model.Driver, error) <span class="cov8" title="1">{
155163

156164
driversByRace := make(map[int][]domain_model.Driver)
157165

166+
var waitGroup sync.WaitGroup
167+
respChannel := make(chan fetchDriversResponse, 8)
168+
158169
for _, race := range races </span><span class="cov8" title="1">{
159-
result, error := dependencies.FetchDriversByRace(race.Id)
160-
if error != nil </span><span class="cov8" title="1">{
161-
return nil, error
170+
waitGroup.Add(1)
171+
go fetchDrivers(
172+
race.Id,
173+
dependencies,
174+
respChannel,
175+
&amp;waitGroup,
176+
)
177+
}</span>
178+
179+
<span class="cov8" title="1">go func() </span><span class="cov8" title="1">{
180+
waitGroup.Wait()
181+
close(respChannel)
182+
}</span>()
183+
184+
<span class="cov8" title="1">for resp := range respChannel </span><span class="cov8" title="1">{
185+
186+
if resp.error != nil </span><span class="cov8" title="1">{
187+
return nil, resp.error
162188
}</span>
163189

164-
<span class="cov8" title="1">driversByRace[race.Id] = result</span>
190+
<span class="cov8" title="1">driversByRace[resp.raceId] = resp.response</span>
165191
}
166192

167193
<span class="cov8" title="1">return driversByRace, nil</span>
168194
}
195+
196+
func fetchDrivers(
197+
raceId int,
198+
dependencies GetDriversByRaceDependencies,
199+
respChan chan&lt;- fetchDriversResponse,
200+
waitGroup *sync.WaitGroup,
201+
) <span class="cov8" title="1">{
202+
defer waitGroup.Done()
203+
204+
result, error := dependencies.FetchDriversByRace(raceId)
205+
206+
if error != nil </span><span class="cov8" title="1">{
207+
respChan &lt;- fetchDriversResponse{
208+
raceId: raceId,
209+
response: nil,
210+
error: error,
211+
}
212+
return
213+
}</span>
214+
215+
<span class="cov8" title="1">respChan &lt;- fetchDriversResponse{
216+
raceId: raceId,
217+
response: result,
218+
error: nil,
219+
}</span>
220+
}
169221
</pre>
170222

171223
<pre class="file" id="file3" style="display: none">package domain_service
172224

173225
import (
226+
"sync"
227+
174228
domain_model "github.com/mmadariaga/go-api/internal/domain/model"
175229
)
176230

@@ -179,6 +233,12 @@
179233
FetchPodiumByRace(raceId int, drivers []domain_model.Driver) ([3]domain_model.Podium, error)
180234
}
181235

236+
type fetchPodiumsResponse struct {
237+
raceId int
238+
response [3]domain_model.Podium
239+
error error
240+
}
241+
182242
func GetPodiumByRace(
183243
races []domain_model.Race,
184244
dependencies GetPodiumByRaceDependencies,
@@ -191,17 +251,62 @@
191251
return nil, error
192252
}</span>
193253

194-
<span class="cov8" title="1">for _, race := range races </span><span class="cov8" title="1">{
195-
result, error := dependencies.FetchPodiumByRace(race.Id, drivers[race.Id])
196-
if error != nil </span><span class="cov8" title="1">{
197-
return nil, error
254+
<span class="cov8" title="1">var waitGroup sync.WaitGroup
255+
respChannel := make(chan fetchPodiumsResponse, 8)
256+
for _, race := range races </span><span class="cov8" title="1">{
257+
waitGroup.Add(1)
258+
go fetchPodiums(
259+
race.Id,
260+
drivers[race.Id],
261+
dependencies,
262+
respChannel,
263+
&amp;waitGroup,
264+
)
265+
}</span>
266+
267+
<span class="cov8" title="1">go func() </span><span class="cov8" title="1">{
268+
waitGroup.Wait()
269+
close(respChannel)
270+
}</span>()
271+
272+
<span class="cov8" title="1">for resp := range respChannel </span><span class="cov8" title="1">{
273+
274+
if resp.error != nil </span><span class="cov8" title="1">{
275+
return nil, resp.error
198276
}</span>
199277

200-
<span class="cov8" title="1">podiumsByRace[race.Id] = result</span>
278+
<span class="cov8" title="1">podiumsByRace[resp.raceId] = resp.response</span>
201279
}
202280

203281
<span class="cov8" title="1">return podiumsByRace, nil</span>
204282
}
283+
284+
func fetchPodiums(
285+
raceId int,
286+
drivers []domain_model.Driver,
287+
dependencies GetPodiumByRaceDependencies,
288+
respChan chan&lt;- fetchPodiumsResponse,
289+
waitGroup *sync.WaitGroup,
290+
) <span class="cov8" title="1">{
291+
defer waitGroup.Done()
292+
293+
result, error := dependencies.FetchPodiumByRace(raceId, drivers)
294+
295+
if error != nil </span><span class="cov8" title="1">{
296+
respChan &lt;- fetchPodiumsResponse{
297+
raceId: raceId,
298+
response: [3]domain_model.Podium{},
299+
error: error,
300+
}
301+
return
302+
}</span>
303+
304+
<span class="cov8" title="1">respChan &lt;- fetchPodiumsResponse{
305+
raceId: raceId,
306+
response: result,
307+
error: nil,
308+
}</span>
309+
}
205310
</pre>
206311

207312
</div>
Lines changed: 56 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,77 @@
11
package domain_service
22

33
import (
4+
"sync"
5+
46
domain_model "github.com/mmadariaga/go-api/internal/domain/model"
57
)
68

79
type GetDriversByRaceDependencies interface {
810
FetchDriversByRace(raceId int) ([]domain_model.Driver, error)
911
}
1012

13+
type fetchDriversResponse struct {
14+
raceId int
15+
response []domain_model.Driver
16+
error error
17+
}
18+
1119
func GetDriversByRace(races []domain_model.Race, dependencies GetDriversByRaceDependencies) (map[int][]domain_model.Driver, error) {
1220

1321
driversByRace := make(map[int][]domain_model.Driver)
1422

23+
var waitGroup sync.WaitGroup
24+
respChannel := make(chan fetchDriversResponse, 8)
25+
1526
for _, race := range races {
16-
result, error := dependencies.FetchDriversByRace(race.Id)
17-
if error != nil {
18-
return nil, error
27+
waitGroup.Add(1)
28+
go fetchDrivers(
29+
race.Id,
30+
dependencies,
31+
respChannel,
32+
&waitGroup,
33+
)
34+
}
35+
36+
go func() {
37+
waitGroup.Wait()
38+
close(respChannel)
39+
}()
40+
41+
for resp := range respChannel {
42+
43+
if resp.error != nil {
44+
return nil, resp.error
1945
}
2046

21-
driversByRace[race.Id] = result
47+
driversByRace[resp.raceId] = resp.response
2248
}
2349

2450
return driversByRace, nil
2551
}
52+
53+
func fetchDrivers(
54+
raceId int,
55+
dependencies GetDriversByRaceDependencies,
56+
respChan chan<- fetchDriversResponse,
57+
waitGroup *sync.WaitGroup,
58+
) {
59+
defer waitGroup.Done()
60+
61+
result, error := dependencies.FetchDriversByRace(raceId)
62+
63+
if error != nil {
64+
respChan <- fetchDriversResponse{
65+
raceId: raceId,
66+
response: nil,
67+
error: error,
68+
}
69+
return
70+
}
71+
72+
respChan <- fetchDriversResponse{
73+
raceId: raceId,
74+
response: result,
75+
error: nil,
76+
}
77+
}

internal/domain/service/GetPodiumByRace.go

Lines changed: 57 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package domain_service
22

33
import (
4+
"sync"
5+
46
domain_model "github.com/mmadariaga/go-api/internal/domain/model"
57
)
68

@@ -9,6 +11,12 @@ type GetPodiumByRaceDependencies interface {
911
FetchPodiumByRace(raceId int, drivers []domain_model.Driver) ([3]domain_model.Podium, error)
1012
}
1113

14+
type fetchPodiumsResponse struct {
15+
raceId int
16+
response [3]domain_model.Podium
17+
error error
18+
}
19+
1220
func GetPodiumByRace(
1321
races []domain_model.Race,
1422
dependencies GetPodiumByRaceDependencies,
@@ -21,14 +29,59 @@ func GetPodiumByRace(
2129
return nil, error
2230
}
2331

32+
var waitGroup sync.WaitGroup
33+
respChannel := make(chan fetchPodiumsResponse, 8)
2434
for _, race := range races {
25-
result, error := dependencies.FetchPodiumByRace(race.Id, drivers[race.Id])
26-
if error != nil {
27-
return nil, error
35+
waitGroup.Add(1)
36+
go fetchPodiums(
37+
race.Id,
38+
drivers[race.Id],
39+
dependencies,
40+
respChannel,
41+
&waitGroup,
42+
)
43+
}
44+
45+
go func() {
46+
waitGroup.Wait()
47+
close(respChannel)
48+
}()
49+
50+
for resp := range respChannel {
51+
52+
if resp.error != nil {
53+
return nil, resp.error
2854
}
2955

30-
podiumsByRace[race.Id] = result
56+
podiumsByRace[resp.raceId] = resp.response
3157
}
3258

3359
return podiumsByRace, nil
3460
}
61+
62+
func fetchPodiums(
63+
raceId int,
64+
drivers []domain_model.Driver,
65+
dependencies GetPodiumByRaceDependencies,
66+
respChan chan<- fetchPodiumsResponse,
67+
waitGroup *sync.WaitGroup,
68+
) {
69+
defer waitGroup.Done()
70+
71+
result, error := dependencies.FetchPodiumByRace(raceId, drivers)
72+
73+
if error != nil {
74+
respChan <- fetchPodiumsResponse{
75+
raceId: raceId,
76+
response: [3]domain_model.Podium{},
77+
error: error,
78+
}
79+
return
80+
}
81+
82+
respChan <- fetchPodiumsResponse{
83+
raceId: raceId,
84+
response: result,
85+
error: nil,
86+
}
87+
}

internal/infrastructure/service/FetchDriversByRace.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,10 @@ type Driver = domain_model.Driver
1616
func FetchDriversByRace(raceId int) ([]Driver, error) {
1717

1818
targetUrl := "https://api.openf1.org/v1/drivers?session_key=" + strconv.Itoa(raceId)
19-
body := helper.HttpGet(targetUrl, true)
19+
body, err := helper.HttpGet(targetUrl, true)
20+
if err != nil {
21+
return nil, err
22+
}
2023

2124
// JSON to struct
2225
var drivers []struct {

internal/infrastructure/service/FetchPodiumByRace.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,10 @@ type Position struct {
2121
func FetchPodiumByRace(raceId int, drivers []domain_model.Driver) ([3]Podium, error) {
2222

2323
targetUrl := "https://api.openf1.org/v1/position?position<=3&session_key=" + strconv.Itoa(raceId)
24-
body := helper.HttpGet(targetUrl, true)
24+
body, err := helper.HttpGet(targetUrl, true)
25+
if err != nil {
26+
return [3]Podium{}, err
27+
}
2528

2629
// JSON to struct
2730
var positions []Position

internal/infrastructure/service/FetchRacesByYear.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,10 @@ type Race = domain_model.Race
1717
func FetchRacesByYear(year int) ([]Race, error) {
1818

1919
targetUrl := "https://api.openf1.org/v1/sessions?year=" + strconv.Itoa(year) + "&session_type=Race"
20-
body := helper.HttpGet(targetUrl, true)
20+
body, err := helper.HttpGet(targetUrl, true)
21+
if err != nil {
22+
return nil, err
23+
}
2124

2225
// JSON to struct
2326
var sessions []struct {

0 commit comments

Comments
 (0)