-
Notifications
You must be signed in to change notification settings - Fork 0
/
model.go
144 lines (124 loc) · 2.45 KB
/
model.go
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
package internal
import (
"errors"
"fmt"
"strings"
"time"
"gopkg.in/yaml.v3"
)
type NodeType string
const (
TypeNote NodeType = "note"
)
const (
// YYYY-MM-DD: 2022-03-23
YYYYMMDD = "2006-01-02"
// 24h hh:mm:ss: 14:23:20
HHMMSS24h = "15:04:05"
)
type Node struct {
Id int32
Title string
Content string
Type NodeType
checked bool
}
type Filter struct {
Field string
Value string
}
type Metadata struct {
Title string
Tags string
}
func NewNote(title, content string) (Node, error) {
if content == "" {
return Node{}, errors.New("Empty content")
}
if title == "" {
title = NewTimeId()
}
return Node{
Title: title,
Content: content,
Type: TypeNote,
}, nil
}
func NewTimeId() string {
t := time.Now()
date := strings.Join(strings.Split(t.Format(YYYYMMDD), "-"), "")
timeF := strings.Join(strings.Split(t.Format(HHMMSS24h), ":"), "")
return fmt.Sprintf("%s%s", date, timeF)
}
func ExtractMetadata(content string) (Metadata, error) {
md := Metadata{}
err := yaml.Unmarshal([]byte(GetYaml(content)), &md)
if err != nil {
return Metadata{}, nil
}
return md, nil
}
func GetYaml(str string) string {
res := ""
queue := []string{}
lines := strings.Split(str, "\n")
open := false
end := false
for _, line := range lines {
tmp := strings.TrimSpace(line)
if tmp == "---" {
queue = append(queue, tmp)
if !open {
open = true
} else {
end = true
break
}
} else if open {
queue = append(queue, line)
}
}
if end {
res = strings.Join(queue, "\n")
}
return res
}
// Include tags check that all tags are included in the metadata
func (m *Metadata) IncludeTags(str string) bool {
set := tagsToSet(m.Tags)
for _, v := range strings.Split(str, ",") {
if !set[strings.TrimSpace(v)] {
return false
}
}
return true
}
func (m *Metadata) GetTags() []string {
_tags := []string{}
if m.Tags == "" {
return _tags
}
for _, v := range strings.Split(m.Tags, ",") {
_tags = append(_tags, strings.TrimSpace(v))
}
return _tags
}
func tagsToSet(str string) map[string]bool {
set := map[string]bool{}
tags := strings.Split(str, ",")
for _, v := range tags {
set[strings.TrimSpace(v)] = true
}
return set
}
type NodeRepository interface {
Save(Node) error
GetNodes() ([]Node, error)
}
type NoteService interface {
New(title, content string) (Node, error)
ListAll() ([]Node, error)
ListAllTags() (map[string]int, error)
GetByTitle(title string) (Node, error)
Find([]Filter) ([]Node, error)
}