Passed
Pull Request — main (#42)
by Yume
01:11
created

core.UpdateMemSelfEvaluated   A

Complexity

Conditions 2

Size

Total Lines 20
Code Lines 13

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 2
eloc 13
nop 3
dl 0
loc 20
rs 9.75
c 0
b 0
f 0
1
package core
2
3
import (
4
	"github.com/memnix/memnixrest/app/models"
5
	"github.com/memnix/memnixrest/pkg/database"
6
	"strings"
7
)
8
9
// UpdateMemSelfEvaluated computes self evaluated mem
10
func UpdateMemSelfEvaluated(r *models.Mem, training bool, quality uint) {
11
	db := database.DBConn
12
13
	mem := new(models.Mem)
14
15
	mem.UserID, mem.CardID = r.UserID, r.CardID
16
17
	mem.Quality = models.MemQualityNone
18
	r.Quality = models.MemQuality(quality)
19
20
	if training {
21
		mem.ComputeTrainingEfactor(r.Efactor, r.Quality)
22
	} else {
23
		mem.ComputeEfactor(r.Efactor, r.Quality)
24
	}
25
26
	mem.Interval, mem.Repetition = r.Interval, r.Repetition
27
28
	db.Save(r)
29
	db.Create(mem)
30
}
31
32
// UpdateMemDate computes NextDate and set it
33
func UpdateMemDate(mem *models.Mem) {
34
	db := database.DBConn
35
	memDate := new(models.MemDate)
36
37
	_ = db.Joins("Card").Joins("User").Joins("Deck").Where("mem_dates.user_id = ? AND mem_dates.card_id = ?",
38
		mem.UserID, mem.CardID).First(&memDate).Error
39
	//TODO: Error handling
40
41
	memDate.ComputeNextDate(int(mem.Interval))
42
43
	db.Save(memDate)
44
45
	//TODO: Return error
46
}
47
48
// UpdateMemTraining computes and set mem values
49
func UpdateMemTraining(r *models.Mem, validation bool) {
50
	db := database.DBConn
51
52
	mem := new(models.Mem)
53
54
	mem.UserID, mem.CardID = r.UserID, r.CardID
55
56
	if validation {
57
		r.ComputeQualitySuccess()
58
	} else {
59
		r.ComputeQualityFail()
60
	}
61
62
	mem.Quality = models.MemQualityNone
63
64
	mem.ComputeTrainingEfactor(r.Efactor, r.Quality)
65
	mem.Interval, mem.Repetition = r.Interval, r.Repetition
66
67
	db.Save(r)
68
	db.Create(mem)
69
}
70
71
// UpdateMem computes and set mem values
72
func UpdateMem(r *models.Mem, validation bool) {
73
	db := database.DBConn
74
75
	mem := new(models.Mem)
76
77
	mem.UserID, mem.CardID = r.UserID, r.CardID
78
79
	if validation {
80
		mem.ComputeInterval(r.Interval, r.Efactor, r.Repetition)
81
		mem.Repetition = r.Repetition + 1
82
		mem.ComputeLearningStage()
83
		r.ComputeQualitySuccess()
84
	} else {
85
		mem.Repetition = 0
86
		mem.Interval = 0
87
		mem.LearningStage = models.StageToLearn
88
		r.ComputeQualityFail()
89
	}
90
91
	mem.Quality = models.MemQualityNone
92
93
	mem.ComputeEfactor(r.Efactor, r.Quality)
94
95
	db.Save(r)
96
	db.Create(mem)
97
98
	UpdateMemDate(mem)
99
}
100
101
func ValidateAnswer(response string, card *models.Card) bool {
102
	var respString, answerString string
103
	if card.Spaces {
104
		respString = strings.Join(strings.Fields(response), " ")
105
		answerString = strings.Join(strings.Fields(card.Answer), " ")
106
	} else {
107
		respString = strings.ReplaceAll(response, " ", "")
108
		answerString = strings.ReplaceAll(card.Answer, " ", "")
109
	}
110
	if card.Case {
111
		return strings.Compare(respString, answerString) == 0
112
	}
113
	return strings.EqualFold(respString, answerString)
114
}
115