Passed
Pull Request — main (#71)
by Yume
01:16
created

pkg/queries/mem.go   A

Size/Duplication

Total Lines 92
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
cc 13
eloc 59
dl 0
loc 92
rs 10
c 0
b 0
f 0

3 Methods

Rating   Name   Duplication   Size   Complexity  
A queries.PostSelfEvaluatedMem 0 22 3
B queries.PostMem 0 41 7
A queries.FetchMem 0 10 3
1
package queries
2
3
import (
4
	"errors"
5
	"github.com/memnix/memnixrest/pkg/core"
6
	"github.com/memnix/memnixrest/pkg/database"
7
	"github.com/memnix/memnixrest/pkg/models"
8
	"github.com/memnix/memnixrest/pkg/utils"
9
	"gorm.io/gorm"
10
	"time"
11
)
12
13
// PostSelfEvaluatedMem updates Mem & MemDate
14
func PostSelfEvaluatedMem(user *models.User, card *models.Card, quality uint, training bool) *models.ResponseHTTP {
15
	db := database.DBConn // DB Conn
16
	res := new(models.ResponseHTTP)
17
18
	memDate := new(models.MemDate)
19
20
	if err := db.Joins("Card").Joins("User").Joins("Deck").Where("mem_dates.user_id = ? AND mem_dates.card_id = ?",
21
		user.ID, card.ID).First(&memDate).Error; err != nil {
22
		res.GenerateError(utils.ErrorRequestFailed) // MemDate not found
23
		// TODO: Create a default MemDate
24
		return res
25
	}
26
27
	exMem := FetchMem(memDate.CardID, user.ID)
28
	if exMem.Efactor == 0 {
29
		exMem.FillDefaultValues(user.ID, card.ID)
30
	}
31
32
	core.UpdateMemSelfEvaluated(exMem, training, quality)
33
34
	res.GenerateSuccess("Success Post Mem", nil, 0)
35
	return res
36
}
37
38
// PostMem updates MemDate & Mem
39
func PostMem(user *models.User, card *models.Card, validation *models.CardResponseValidation, training bool) *models.ResponseHTTP {
40
	db := database.DBConn // DB Conn
41
	res := new(models.ResponseHTTP)
42
43
	memDate := new(models.MemDate)
44
45
	if err := db.Joins("Card").Joins("User").Joins("Deck").Where("mem_dates.user_id = ? AND mem_dates.card_id = ?",
46
		user.ID, card.ID).First(&memDate).Error; err != nil {
47
		res.GenerateError(utils.ErrorRequestFailed) // MemDate not found
48
		// TODO: Create a default MemDate
49
		return res
50
	}
51
52
	exMem := FetchMem(memDate.CardID, user.ID)
53
	if exMem.Efactor == 0 {
54
		exMem.FillDefaultValues(user.ID, card.ID)
55
	}
56
57
	if training {
58
		core.UpdateMemTraining(exMem, validation.Validate)
59
	} else {
60
		memDate, err := core.UpdateMem(exMem, validation.Validate)
61
		if err != nil {
62
			res.GenerateError(utils.ErrorRequestFailed)
63
			return res
64
		}
65
		t := time.Now()
66
		if memDate.NextDate.Before(t.AddDate(0, 0, 1).Add(
67
			time.Duration(-t.Hour()) * time.Hour)) {
68
			GetCache().Replace(memDate.UserID, *memDate)
69
		} else {
70
			err = GetCache().DeleteItem(memDate.UserID, memDate.ID)
71
			if err != nil {
72
				res.GenerateError(utils.ErrorRequestFailed)
73
				return res
74
			}
75
		}
76
	}
77
78
	res.GenerateSuccess("Success Post Mem", nil, 0)
79
	return res
80
}
81
82
// FetchMem returns last mem of a user on a given card
83
func FetchMem(cardID, userID uint) *models.Mem {
84
	db := database.DBConn // DB Conn
85
86
	mem := new(models.Mem)
87
	if err := db.Joins("Card").Where("mems.card_id = ? AND mems.user_id = ?", cardID, userID).Order("id desc").First(&mem).Error; err != nil {
88
		if errors.Is(err, gorm.ErrRecordNotFound) {
89
			mem.Efactor = 0
90
		}
91
	}
92
	return mem
93
}
94