Passed
Push — main ( ec8dc2...0c32c3 )
by Yume
01:06
created

core.FetchNextTodayMemByUserAndDeck   A

Complexity

Conditions 2

Size

Total Lines 18
Code Lines 15

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 2
eloc 15
nop 3
dl 0
loc 18
rs 9.65
c 0
b 0
f 0
1
package core
2
3
import (
4
	"memnixrest/database"
5
	"memnixrest/models"
6
	"time"
7
8
	"github.com/gofiber/fiber/v2"
9
)
10
11
// GetMemByID
12
func GetMemByID(c *fiber.Ctx, id uint) models.Mem {
13
	db := database.DBConn
14
	mem := new(models.Mem)
15
16
	if err := db.Joins("User").Joins("Card").First(&mem, id).Error; err != nil {
17
		return *mem
18
	}
19
	return *mem
20
}
21
22
// GetMemByCardAndUser
23
func GetMemByCardAndUser(c *fiber.Ctx, userID uint, cardID uint) models.Mem {
24
25
	db := database.DBConn
26
27
	mem := new(models.Mem)
28
29
	if err := db.Joins("User").Joins("Card").Where("mems.user_id = ? AND mems.card_id = ?", userID, cardID).First(&mem).Error; err != nil {
30
		return *mem
31
		// TODO: Handle errors
32
	}
33
	return *mem
34
}
35
36
// FetchNextTodayMemByUserAndDeck
37
func FetchNextTodayMemByUserAndDeck(c *fiber.Ctx, user *models.User, deck_id uint) models.ResponseHTTP {
38
	db := database.DBConn
39
	mem := new(models.Mem)
40
	// Get next card with date condition
41
	t := time.Now()
42
	if err := db.Joins("Card").Joins("User").Joins("Deck").Where("mems.user_id = ? AND mems.deck_id =? AND mems.next_date < ?",
43
		&user.ID, deck_id, t.AddDate(0, 0, 1).Add(
44
			time.Duration(-t.Hour())*time.Hour)).Limit(1).Order("next_date asc").Find(&mem).Error; err != nil {
45
		return models.ResponseHTTP{
46
			Success: false,
47
			Message: "Next today mem not found",
48
			Data:    nil,
49
		}
50
	}
51
	return models.ResponseHTTP{
52
		Success: true,
53
		Message: "Get Next Today Mem",
54
		Data:    *mem,
55
	}
56
}
57
58
// FetchNextMemByUserAndDeck
59
func FetchNextMemByUserAndDeck(c *fiber.Ctx, user *models.User, deck_id uint) models.ResponseHTTP {
60
	db := database.DBConn
61
	mem := new(models.Mem)
62
63
	if err := db.Joins("Card").Joins("User").Joins("Deck").Where("mems.user_id = ? AND mems.deck_id =?", &user.ID, deck_id).Limit(1).Order("next_date asc").Find(&mem).Error; err != nil {
64
		return models.ResponseHTTP{
65
			Success: false,
66
			Message: "Next mem not found",
67
			Data:    nil,
68
		}
69
70
	}
71
	return models.ResponseHTTP{
72
		Success: true,
73
		Message: "Get Next Mem",
74
		Data:    *mem,
75
	}
76
}
77
78
// GenerateAccess
79
func GenerateAccess(c *fiber.Ctx, userID uint, deckID uint) models.ResponseHTTP {
80
	db := database.DBConn
81
82
	access := new(models.Access)
83
	if err := db.Joins("User").Joins("Deck").Where("accesses.user_id = ? AND accesses.deck_id =?", userID, deckID).Find(&access).Error; err != nil {
84
		access.DeckID = deckID
85
		access.UserID = userID
86
		access.Permission = 1
87
		db.Preload("User").Preload("Deck").Create(access)
88
	} else {
89
		access.Permission = 1
90
		db.Preload("User").Preload("Deck").Save(access)
91
	}
92
93
	return models.ResponseHTTP{
94
		Success: true,
95
		Message: "Success register an access",
96
		Data:    *access,
97
		Count:   1,
98
	}
99
}
100
101
// GenerateMem
102
func GenerateMem(c *fiber.Ctx, userID uint, deckID uint) models.ResponseHTTP {
103
	db := database.DBConn
104
	var cards []models.Card // Cards array
105
106
	if err := db.Joins("Deck").Where("cards.deck_id = ?", deckID).Find(&cards).Error; err != nil {
107
		return (models.ResponseHTTP{
108
			Success: false,
109
			Message: err.Error(),
110
			Data:    nil,
111
			Count:   0,
112
		})
113
	}
114
115
	for x := 0; x < len(cards); x++ {
116
		mem := new(models.Mem)
117
118
		if err := db.Where("mems.user_id = ? AND mems.card_id = ?", userID, cards[x].ID).First(&mem).Error; err != nil {
119
			mem.CardID = cards[x].ID
120
			mem.UserID = userID
121
			mem.DeckID = deckID
122
			mem.Efactor = 2.5
123
			mem.Interval = 0
124
			mem.Total = 0
125
			mem.NextDate = time.Now()
126
			mem.Quality = 0
127
			mem.Repetition = 0
128
129
			db.Preload("User").Preload("Card").Create(mem)
130
		}
131
	}
132
133
	return (models.ResponseHTTP{
134
		Success: true,
135
		Message: "Generate mems",
136
		Data:    nil,
137
		Count:   0,
138
	})
139
}
140