Passed
Pull Request — main (#17)
by Yume
01:15
created

core.ComputeInterval   A

Complexity

Conditions 5

Size

Total Lines 10
Code Lines 10

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 5
eloc 10
nop 1
dl 0
loc 10
rs 9.3333
c 0
b 0
f 0
1
package core
2
3
import (
4
	"memnixrest/app/models"
5
	"memnixrest/pkg/database"
6
	"time"
7
8
	"github.com/gofiber/fiber/v2"
9
)
10
11
func ComputeQualitySuccess(memType models.CardType, repetition uint) uint {
12
13
	if memType == models.CardMCQ {
14
		return 3
15
	} else {
16
		if repetition > 3 {
17
			return 5
18
		}
19
		return 4
20
	}
21
}
22
23
func ComputeQualityFailed(memType models.CardType, repetition uint) uint {
24
	if memType == models.CardMCQ {
25
		if repetition <= 3 {
26
			return 0
27
		}
28
		return 1
29
	}
30
	if repetition <= 4 {
31
		return 1
32
	}
33
	return 2
34
35
}
36
37
func UpdateMemDate(mem *models.Mem) {
38
	db := database.DBConn
39
40
	memDate := new(models.MemDate)
41
42
	_ = db.Joins("Card").Joins("User").Joins("Deck").Where("mem_dates.user_id = ? AND mem_dates.card_id = ?",
43
		mem.UserID, mem.CardID).First(&memDate).Error
44
45
	memDate.NextDate = time.Now().AddDate(0, 0, int(mem.Interval))
46
47
	db.Save(memDate)
48
49
	//TODO: Return error
50
51
}
52
53
// UpdateMem function
54
func UpdateMem(_ *fiber.Ctx, r *models.Mem, validation *models.CardResponseValidation, training bool) {
55
56
	db := database.DBConn
57
58
	mem := new(models.Mem)
59
60
	mem.UserID, mem.CardID = r.UserID, r.CardID
61
62
	memType := r.GetMemType()
63
64
	if validation.Validate {
65
		if !training {
66
			mem.ComputeInterval(r.Interval, r.Efactor, r.Repetition)
67
			mem.Repetition = r.Repetition + 1
68
		}
69
		r.Quality = ComputeQualitySuccess(memType, r.Repetition)
70
71
	} else {
72
		if !training {
73
			mem.Repetition = 0
74
			mem.Interval = 0
75
		}
76
		r.Quality = ComputeQualityFailed(memType, r.Repetition)
77
	}
78
79
	if training {
80
		mem.ComputeTrainingEfactor(r.Efactor, r.Quality)
81
		mem.Interval = r.Interval
82
		mem.Repetition = r.Repetition
83
	} else {
84
		mem.ComputeEfactor(r.Efactor, r.Quality)
85
	}
86
87
	db.Save(r)
88
	db.Create(mem)
89
90
	if !training {
91
		UpdateMemDate(mem)
92
	}
93
}
94