ThreeDotsLabs / wild-workouts-go-ddd-example

Go DDD example application. Complete project to show how to apply DDD, Clean Architecture, and CQRS by practical refactoring.
https://threedots.tech
MIT License
5.14k stars 472 forks source link

Not persisting hours after creating them with the in-memory repository #4

Open msamoylov opened 3 years ago

msamoylov commented 3 years ago

So, you're creating a new Hour, but returning it immediately without storing it in the map.

https://github.com/ThreeDotsLabs/wild-workouts-go-ddd-example/blob/22c0a25b67c4669d612a2fa4a434ffae8e35e65a/internal/trainer/adapters/hour_memory_repository.go#L40

It looks like ok will be always false.

https://github.com/ThreeDotsLabs/wild-workouts-go-ddd-example/blob/22c0a25b67c4669d612a2fa4a434ffae8e35e65a/internal/trainer/adapters/hour_memory_repository.go#L38

Am I missing something here?

roblaszczak commented 3 years ago

That should be documented better 😉.

In general, the idea is, that the repository should be independent of the database, but be rather some domain concept. By example it will be probably more clear:

In practice (not in the database, in reality) hour exists, even if it was not persisted. So for example, if we didn't persist 14:00 it exists anyway and is available for training. So that's why it is not persisted in GetHour.

If we want to persist it, we need to explicitly call UpdateHour. This is also how it works for all other implementations.

Does it make sense for you?

msamoylov commented 3 years ago

What I was saying, is that you're just returning a newly created hour without putting it to the map.

https://github.com/ThreeDotsLabs/wild-workouts-go-ddd-example/blob/22c0a25b67c4669d612a2fa4a434ffae8e35e65a/internal/trainer/adapters/hour_memory_repository.go#L40

This should be IMO:

        currentHour, err := m.hourFactory.NewNotAvailableHour(hourTime) 
        // Handle error, skipped
        m.hours[hourTime] = *currentHour

Otherwise your in-memory storage doesn't make much sense.

m110 commented 3 years ago

@msamoylov It's persisted in the UpdateHour method: https://github.com/ThreeDotsLabs/wild-workouts-go-ddd-example/blob/22c0a25b67c4669d612a2fa4a434ffae8e35e65a/internal/trainer/adapters/hour_memory_repository.go#L66

The result of GetHour is returned to the frontend application, which shows the hour as empty, if it's not filled in the database. The user can then click a button to fill it.