aboutsummaryrefslogtreecommitdiff
path: root/modules/lists/lists.go
blob: 343ba627ff513b6e96ab657264fc4b593695dcb5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
package lists

import (
	"database/sql"
	"fagott.pw/charakterin"
	"fagott.pw/grilist/frontend"
	"fagott.pw/grilist/grilist"
	"fagott.pw/grilist/modules/grils"
	"fmt"
	"log"
	"time"
)

// Module und so.
type Module struct {
	g     *grilist.Grilist
	grils *grils.GrilsModule
}

// List ist eine Liste an DINGEN.
type List struct {
	ID          int
	Name        string
	Description string
	Owner       *charakterin.User
	ForkOf      int
	UpdatedAt   time.Time
}

// Name gibt den Namen des Moduls zurück
func (m *Module) Name() string {
	return "Lists"
}

// Init initialisiert das Modul
func (m *Module) Init(g *grilist.Grilist) {
	m.g = g

	gm, ok := g.Modules["Grils"]
	if !ok {
		log.Fatal("lists: grils module not found")
	}

	grilsModule, ok := gm.Interface().(*grils.GrilsModule)
	if !ok {
		log.Fatal("lists: error with grils module")
	}
	m.grils = grilsModule
}

// Interface gibt das Modul zurück
func (m *Module) Interface() interface{} {
	return m
}

// GetUserLists gibt die Listen eines Benutzers zurück.
func (m *Module) GetUserLists(u *charakterin.User) []*List {
	var lists []*List

	rows, err := m.g.DB.Query(`SELECT id, name, description, fork_of, updated_at FROM grilist.lists WHERE user_id = $1`, u.ID)
	if err != nil {
		return lists
	}

	defer rows.Close()
	for rows.Next() {
		list := &List{}

		if err := rows.Scan(&list.ID, &list.Name, &list.Description, &list.ForkOf, &list.UpdatedAt); err != nil {
			log.Println("error scanning row", err)
			continue
		}

		lists = append(lists, list)
	}

	return lists
}

func mkCard(title, description string, actions ...frontend.Action) frontend.Card {
	card := frontend.Card{
		Title:       title,
		Description: description,
		Size:        "medium",
	}

	for _, action := range actions {
		card.Actions = append(card.Actions, action)
	}

	return card
}

func rowsToCard(rows *sql.Rows) []frontend.Card {
	var cards []frontend.Card

	for rows.Next() {
		var id int
		var title, description string
		if err := rows.Scan(&id, &title, &description); err != nil {
			log.Println("error scanning row", err)
			continue
		}

		cards = append(cards, mkCard(title, description, frontend.Action{"anguckieren", fmt.Sprintf("/lists/%d", id)}))
	}
	return cards
}

// ProvideDashboardData gibt Daten für das Dashboard bezogen auf den Benutzer zurück
func (m *Module) ProvideDashboardData(user *charakterin.User) []grilist.DashboardCategory {
	var categories []grilist.DashboardCategory

	// Listen des Benutzers
	rows, err := m.g.DB.Query(`SELECT id, name, description FROM grilist.lists WHERE user_id = $1`, user.ID)
	if err != nil {
		log.Println(err)
		return []grilist.DashboardCategory{}
	}
	defer rows.Close()

	categories = append(categories, grilist.DashboardCategory{
		Title: "Meine Listen",
		Cards: rowsToCard(rows),
	})

	// Neue Listen
	rows, err = m.g.DB.Query(`SELECT id, name, description FROM grilist.lists ORDER BY id DESC LIMIT 5`)
	if err != nil {
		log.Println(err)
		return categories
	}
	defer rows.Close()

	categories = append(categories, grilist.DashboardCategory{
		Title: "Neueste Listen",
		Cards: rowsToCard(rows),
	})

	return categories
}

// New erstellt eine neue Instanz des Modules
func New() *Module {
	return &Module{}
}