Passed
Push — main ( 26be31...19cade )
by Yume
01:25
created

core.UpdateMem   F

Complexity

Conditions 14

Size

Total Lines 62
Code Lines 42

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 14
eloc 42
nop 3
dl 0
loc 62
rs 3.6
c 0
b 0
f 0

How to fix   Long Method    Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

Complexity

Complex classes like core.UpdateMem often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

1
package core
2
3
import (
4
	"memnixrest/app/database"
5
	"memnixrest/app/models"
6
	"time"
7
8
	"github.com/gofiber/fiber/v2"
9
)
10
11
// UpdateMem
12
func UpdateMem(c *fiber.Ctx, r *models.Mem, validation models.CardResponseValidation) {
13
	db := database.DBConn
14
15
	mem := new(models.Mem)
16
17
	mem.UserID = r.UserID
18
	mem.CardID = r.CardID
19
20
	var memType int
21
22
	if r.Efactor <= 1.4 || r.Quality <= 1 || r.Repetition < 2 {
23
		memType = 2
24
	}
25
26
	if validation.Validate {
27
		if r.Repetition == 0 {
28
			mem.Interval = 1
29
		} else if r.Repetition == 1 {
30
			mem.Interval = 2
31
		} else if r.Repetition == 2 {
32
			mem.Interval = 2
33
		} else if r.Repetition == 3 {
34
			mem.Interval = 3
35
		} else {
36
			mem.Interval = uint((float32(r.Interval) * r.Efactor)) + 1
37
		}
38
		mem.Repetition = r.Repetition + 1
39
		if memType == 2 {
40
			mem.Quality = 4
41
		} else {
42
			mem.Quality = 5
43
		}
44
	} else {
45
		mem.Repetition = 0
46
		mem.Interval = 0
47
		if memType == 2 {
48
			mem.Quality = 1
49
			if r.Repetition <= 1 {
50
				mem.Quality = 0
51
			}
52
		} else {
53
			mem.Quality = 3
54
		}
55
	}
56
57
	mem.Efactor = r.Efactor + (0.1 - (5.0-float32(mem.Quality))*(0.08+(5-float32(mem.Quality)))*0.02)
58
59
	if mem.Efactor < 1.3 {
60
		mem.Efactor = 1.3
61
	}
62
63
	db.Create(mem)
64
65
	memDate := new(models.MemDate)
66
67
	if err := db.Joins("Card").Joins("User").Joins("Deck").Where("mem_dates.user_id = ? AND mem_dates.card_id = ?",
68
		mem.UserID, mem.CardID).First(&memDate).Error; err != nil {
69
	}
70
71
	memDate.NextDate = time.Now().AddDate(0, 0, int(mem.Interval))
72
73
	db.Save(memDate)
74
75
	//TODO: Return error
76
}
77