Passed
Pull Request — main (#166)
by Yume
01:56
created

deck.*UseCase.Create   A

Complexity

Conditions 2

Size

Total Lines 5
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 2
eloc 4
nop 2
dl 0
loc 5
rs 10
c 0
b 0
f 0
1
package deck
2
3
import (
4
	"context"
5
6
	"github.com/fxamacker/cbor/v2"
7
	"github.com/memnix/memnix-rest/domain"
8
)
9
10
// UseCase is the deck use case.
11
type UseCase struct {
12
	IRepository
13
	IRedisRepository
14
}
15
16
// NewUseCase returns a new deck use case.
17
func NewUseCase(repo IRepository, redis IRedisRepository) IUseCase {
18
	return &UseCase{IRepository: repo, IRedisRepository: redis}
19
}
20
21
// GetByID returns the deck with the given id.
22
func (u *UseCase) GetByID(ctx context.Context, id uint) (domain.Deck, error) {
23
	var deckObject domain.Deck
24
25
	if cacheHit, _ := u.IRedisRepository.GetByID(ctx, id); cacheHit != "" {
26
		if err := cbor.Unmarshal([]byte(cacheHit), &deckObject); err == nil {
27
			return deckObject, nil
28
		}
29
	}
30
31
	deckObject, err := u.IRepository.GetByID(ctx, id)
32
	if err != nil {
33
		return domain.Deck{}, err
34
	}
35
36
	var marshalledDeck []byte
37
	if marshalledDeck, err = cbor.Marshal(deckObject); err == nil {
38
		_ = u.IRedisRepository.SetByID(ctx, id, string(marshalledDeck))
39
	}
40
41
	return deckObject, nil
42
}
43
44
// Create creates a new deck.
45
func (u *UseCase) Create(ctx context.Context, deck *domain.Deck) error {
46
	if marshalledDeck, err := cbor.Marshal(deck); err == nil {
47
		_ = u.IRedisRepository.SetByID(ctx, deck.ID, string(marshalledDeck))
48
	}
49
	return u.IRepository.Create(ctx, deck)
50
}
51
52
// CreateFromUser creates a new deck from the given user.
53
func (u *UseCase) CreateFromUser(ctx context.Context, user domain.User, deck *domain.Deck) error {
54
	if marshalledDeck, err := cbor.Marshal(deck); err == nil {
55
		_ = u.IRedisRepository.SetByID(ctx, deck.ID, string(marshalledDeck))
56
	}
57
	return u.IRepository.CreateFromUser(ctx, user, deck)
58
}
59
60
// GetByUser returns the decks of the given user.
61
func (u *UseCase) GetByUser(ctx context.Context, user domain.User) ([]domain.Deck, error) {
62
	var ownedDecks []domain.Deck
63
64
	if cacheHit, _ := u.IRedisRepository.GetOwnedByUser(ctx, user.ID); cacheHit != "" {
65
		if err := cbor.Unmarshal([]byte(cacheHit), &ownedDecks); err == nil {
66
			return ownedDecks, nil
67
		}
68
	}
69
70
	ownedDecks, err := u.IRepository.GetByUser(ctx, user)
71
	if err != nil {
72
		return []domain.Deck{}, err
73
	}
74
75
	var marshalledDeck []byte
76
	if marshalledDeck, err = cbor.Marshal(ownedDecks); err == nil {
77
		_ = u.IRedisRepository.SetOwnedByUser(ctx, user.ID, string(marshalledDeck))
78
	}
79
	return ownedDecks, nil
80
}
81
82
// GetByLearner returns the decks of the given learner.
83
func (u *UseCase) GetByLearner(ctx context.Context, user domain.User) ([]domain.Deck, error) {
84
	var learningDecks []domain.Deck
85
86
	if cacheHit, _ := u.IRedisRepository.GetLearningByUser(ctx, user.ID); cacheHit != "" {
87
		if err := cbor.Unmarshal([]byte(cacheHit), &learningDecks); err == nil {
88
			return learningDecks, nil
89
		}
90
	}
91
92
	learnedDecks, err := u.IRepository.GetByLearner(ctx, user)
93
	if err != nil {
94
		return []domain.Deck{}, err
95
	}
96
97
	var marshalledDeck []byte
98
	if marshalledDeck, err = cbor.Marshal(learnedDecks); err == nil {
99
		_ = u.IRedisRepository.SetLearningByUser(ctx, user.ID, string(marshalledDeck))
100
	}
101
	return learnedDecks, nil
102
}
103
104
// GetPublic returns the public decks.
105
func (u *UseCase) GetPublic(ctx context.Context) ([]domain.Deck, error) {
106
	return u.IRepository.GetPublic(ctx)
107
}
108