Skip to content

Commit c2bc619

Browse files
authored
Merge pull request #7 from zekroTJA/dev
release 1.4
2 parents b549c8e + 90f9e6a commit c2bc619

22 files changed

+12588
-107
lines changed

.gitignore

-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ private.*
2020
vendor/*
2121

2222
node_modules
23-
package-lock.json
2423
dist
2524
bin/*
2625

.travis.yml

+18-4
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,22 @@ language: go
55
go:
66
- tip
77

8-
go_import_path: github.com/zekroTJA/myrunes
9-
10-
script:
11-
- time bash ./ci/travis.sh
8+
jobs:
9+
include:
10+
11+
- stage: build
12+
name: Build
13+
script: time bash ./ci/travis.sh
1214

15+
- stage: docker-deploy
16+
name: Docker Deploy Branch
17+
if: branch = master OR branch = dev
18+
script: bash ./ci/docker-deploy.sh
19+
20+
- stage: docker-deploy-tag
21+
name: Docker Deploy Tag
22+
if: tag IS present
23+
script: |
24+
docker build . -t zekro/myrunes:${TRAVIS_TAG}
25+
docker login -u ${DOCKER_USERNAME} -p ${DOCKER_PASSWORD}
26+
docker push zekro/myrunes:${TRAVIS_TAG}

Dockerfile

+8-29
Original file line numberDiff line numberDiff line change
@@ -1,52 +1,31 @@
1-
FROM golang:1.13
2-
1+
FROM golang:1.13 as build
32
LABEL maintainer="zekro <[email protected]>"
4-
5-
#### PREPARINGS #####
6-
7-
# install node.js
3+
ARG RELEASE=TRUE
84
RUN curl -sL https://deb.nodesource.com/setup_13.x | bash - &&\
95
apt-get install -y nodejs
10-
11-
# install vue CLI
126
RUN npm i -g @vue/cli
13-
14-
# set workdir to go application dir
157
WORKDIR /var/myrunes
16-
17-
# add nessecary repository files
188
ADD . .
19-
20-
# ensure dependencies with go mod
219
RUN go mod tidy
22-
23-
# install web dependencies
2410
RUN cd web &&\
25-
npm i
26-
11+
npm ci
2712
RUN mkdir ./bin
28-
29-
#### BUILD BACK END ####
30-
3113
RUN go build \
3214
-v -o /app/myrunes -ldflags "\
33-
-X github.com/zekroTJA/myrunes/internal/static.Release=TRUE \
15+
-X github.com/zekroTJA/myrunes/internal/static.Release=${RELEASE} \
3416
-X github.com/zekroTJA/myrunes/internal/static.AppVersion=$(git describe --tags)" \
3517
./cmd/server/*.go
36-
37-
#### BUILD FRONT END ####
38-
3918
RUN cd ./web &&\
4019
npm run build &&\
4120
cd .. &&\
4221
mkdir -p /app/web &&\
4322
cp -r ./web/dist /app/web/dist
4423

4524

46-
#### EXPOSE AND RUN SETTINGS ####
25+
FROM debian:stretch-slim AS final
26+
WORKDIR /app
27+
COPY --from=build /app .
4728

4829
EXPOSE 8080
49-
5030
RUN mkdir -p /etc/myrunes
51-
52-
CMD ["/app/myrunes", "-c", "/etc/myrunes/config.yml"]
31+
CMD ["/app/myrunes", "-c", "/etc/myrunes/config.yml", "-assets", "/app/web/dist"]

ci/docker-deploy.sh

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
BRANCH=${TRAVIS_BRANCH}
2+
RELEASE=TRUE
3+
4+
if [ "${BRANCH}" == "master" ]; then
5+
BRANCH=latest
6+
fi
7+
8+
if [ "${BRANCH}" == "dev" ]; then
9+
BRANCH=canary
10+
RELEASE=FALSE
11+
fi
12+
13+
docker build . -t zekro/myrunes:${BRANCH} --build-arg RELEASE=${RELEASE}
14+
docker login -u ${DOCKER_USERNAME} -p ${DOCKER_PASSWORD}
15+
docker push zekro/myrunes:${BRANCH}

cmd/server/main.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import (
1717

1818
var (
1919
flagConfig = flag.String("c", "config.yml", "config file location")
20+
flagAssets = flag.String("assets", "", "assets location")
2021
)
2122

2223
func main() {
@@ -73,7 +74,7 @@ func main() {
7374
}()
7475

7576
logger.Info("WEBSERVER :: initialization")
76-
ws := webserver.NewWebServer(db, cfg.WebServer)
77+
ws := webserver.NewWebServer(db, cfg.WebServer, *flagAssets)
7778
go func() {
7879
if err := ws.ListenAndServeBlocking(); err != nil {
7980
logger.Fatal("WEBSERVER :: failed starting web server: %s", err.Error())

internal/database/middleware.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ type Middleware interface {
2727
DeleteUser(uid snowflake.ID) error
2828

2929
CreatePage(page *objects.Page) error
30-
GetPages(uid snowflake.ID, sortLess func(i, j *objects.Page) bool) ([]*objects.Page, error)
30+
GetPages(uid snowflake.ID, champion string, sortLess func(i, j *objects.Page) bool) ([]*objects.Page, error)
3131
GetPage(uid snowflake.ID) (*objects.Page, error)
3232
EditPage(page *objects.Page) (*objects.Page, error)
3333
DeletePage(uid snowflake.ID) error

internal/database/mongodb.go

+14-3
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,10 @@ func (m *MongoDB) EditUser(user *objects.User, login bool) (bool, error) {
135135
oldUser.PassHash = user.PassHash
136136
}
137137

138+
if user.PageOrder != nil {
139+
oldUser.PageOrder = user.PageOrder
140+
}
141+
138142
return true, m.insertOrUpdate(m.collections.users,
139143
bson.M{"uid": oldUser.UID}, oldUser)
140144
}
@@ -155,8 +159,15 @@ func (m *MongoDB) CreatePage(page *objects.Page) error {
155159
return m.insert(m.collections.pages, page)
156160
}
157161

158-
func (m *MongoDB) GetPages(uid snowflake.ID, sortLess func(i, j *objects.Page) bool) ([]*objects.Page, error) {
159-
count, err := m.count(m.collections.pages, bson.M{"owner": uid})
162+
func (m *MongoDB) GetPages(uid snowflake.ID, champion string, sortLess func(i, j *objects.Page) bool) ([]*objects.Page, error) {
163+
var query bson.M
164+
if champion != "" && champion != "general" {
165+
query = bson.M{"owner": uid, "champions": champion}
166+
} else {
167+
query = bson.M{"owner": uid}
168+
}
169+
170+
count, err := m.count(m.collections.pages, query)
160171
if err != nil {
161172
return nil, err
162173
}
@@ -167,7 +178,7 @@ func (m *MongoDB) GetPages(uid snowflake.ID, sortLess func(i, j *objects.Page) b
167178
return pages, nil
168179
}
169180

170-
res, err := m.collections.pages.Find(ctxTimeout(5*time.Second), bson.M{"owner": uid})
181+
res, err := m.collections.pages.Find(ctxTimeout(5*time.Second), query)
171182
if err != nil {
172183
return nil, err
173184
}

internal/objects/user.go

+8-7
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,14 @@ var (
2121
)
2222

2323
type User struct {
24-
UID snowflake.ID `json:"uid"`
25-
Username string `json:"username"`
26-
DisplayName string `json:"displayname"`
27-
PassHash []byte `json:"passhash,omitempty"`
28-
LastLogin time.Time `json:"lastlogin"`
29-
Created time.Time `json:"created"`
30-
Favorites []string `json:"favorites"`
24+
UID snowflake.ID `json:"uid"`
25+
Username string `json:"username"`
26+
DisplayName string `json:"displayname"`
27+
PassHash []byte `json:"passhash,omitempty"`
28+
LastLogin time.Time `json:"lastlogin"`
29+
Created time.Time `json:"created"`
30+
Favorites []string `json:"favorites"`
31+
PageOrder map[string][]snowflake.ID `json:"pageorder"`
3132
}
3233

3334
func NewUser(username, password string, authMiddleware auth.Middleware) (*User, error) {

internal/webserver/handlers.go

+69-2
Original file line numberDiff line numberDiff line change
@@ -175,8 +175,16 @@ func (ws *WebServer) handlerCreatePage(ctx *routing.Context) error {
175175

176176
func (ws *WebServer) handlerGetPages(ctx *routing.Context) error {
177177
user := ctx.Get("user").(*objects.User)
178+
queryArgs := ctx.QueryArgs()
179+
180+
sortBy := string(queryArgs.Peek("sortBy"))
181+
champion := string(queryArgs.Peek("champion"))
182+
short := string(queryArgs.Peek("short"))
183+
184+
if champion == "" {
185+
champion = "general"
186+
}
178187

179-
sortBy := string(ctx.QueryArgs().Peek("sortBy"))
180188
var sortFunc func(i, j *objects.Page) bool
181189

182190
switch sortBy {
@@ -188,13 +196,45 @@ func (ws *WebServer) handlerGetPages(ctx *routing.Context) error {
188196
sortFunc = func(i, j *objects.Page) bool {
189197
return comparison.Alphabetically(i.Title, j.Title)
190198
}
199+
case "custom":
200+
if user.PageOrder != nil {
201+
pageOrder, ok := user.PageOrder[champion]
202+
if ok {
203+
sortFunc = func(i, j *objects.Page) bool {
204+
var pix, jix int
205+
for ix, uid := range pageOrder {
206+
if uid == i.UID {
207+
pix = ix
208+
} else if uid == j.UID {
209+
jix = ix
210+
}
211+
}
212+
return jix > pix
213+
}
214+
}
215+
}
191216
}
192217

193-
pages, err := ws.db.GetPages(user.UID, sortFunc)
218+
pages, err := ws.db.GetPages(user.UID, champion, sortFunc)
194219
if err != nil {
195220
return jsonError(ctx, err, fasthttp.StatusInternalServerError)
196221
}
197222

223+
if comparison.IsTrue(short) {
224+
m := make(map[string]int)
225+
for _, p := range pages {
226+
for _, c := range p.Champions {
227+
if _, ok := m[c]; !ok {
228+
m[c] = 1
229+
} else {
230+
m[c]++
231+
}
232+
}
233+
}
234+
235+
return jsonResponse(ctx, &listResponse{N: len(m), Data: m}, fasthttp.StatusOK)
236+
}
237+
198238
return jsonResponse(ctx, &listResponse{N: len(pages), Data: pages}, fasthttp.StatusOK)
199239
}
200240

@@ -616,3 +656,30 @@ func (ws *WebServer) handlerDeleteAPIToken(ctx *routing.Context) error {
616656

617657
return jsonResponse(ctx, nil, fasthttp.StatusOK)
618658
}
659+
660+
func (ws *WebServer) handlerPostPageOrder(ctx *routing.Context) error {
661+
user := ctx.Get("user").(*objects.User)
662+
663+
queryArgs := ctx.QueryArgs()
664+
champion := string(queryArgs.Peek("champion"))
665+
666+
if champion == "" {
667+
champion = "general"
668+
}
669+
670+
pageOrder := new(pageOrderRequest)
671+
if err := parseJSONBody(ctx, pageOrder); err != nil {
672+
return jsonError(ctx, err, fasthttp.StatusBadRequest)
673+
}
674+
675+
if user.PageOrder == nil {
676+
user.PageOrder = make(map[string][]snowflake.ID)
677+
}
678+
679+
user.PageOrder[champion] = pageOrder.PageOrder
680+
if _, err := ws.db.EditUser(user, false); err != nil {
681+
return jsonError(ctx, err, fasthttp.StatusInternalServerError)
682+
}
683+
684+
return jsonResponse(ctx, nil, fasthttp.StatusOK)
685+
}

internal/webserver/structs.go

+5
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package webserver
33
import (
44
"time"
55

6+
"github.com/bwmarrin/snowflake"
67
"github.com/zekroTJA/myrunes/internal/objects"
78
)
89

@@ -39,3 +40,7 @@ type sessionsResponse struct {
3940

4041
CurrentlyConnectedID string `json:"currentlyconnectedid"`
4142
}
43+
44+
type pageOrderRequest struct {
45+
PageOrder []snowflake.ID `json:"pageorder"`
46+
}

internal/webserver/websrever.go

+7-1
Original file line numberDiff line numberDiff line change
@@ -52,9 +52,13 @@ type WebServer struct {
5252
config *Config
5353
}
5454

55-
func NewWebServer(db database.Middleware, config *Config) (ws *WebServer) {
55+
func NewWebServer(db database.Middleware, config *Config, assets string) (ws *WebServer) {
5656
ws = new(WebServer)
5757

58+
if assets != "" {
59+
fileHandlerStatic.Root = assets
60+
}
61+
5862
ws.config = config
5963
ws.db = db
6064
ws.rlm = NewRateLimitManager()
@@ -99,6 +103,8 @@ func (ws *WebServer) registerHandlers() {
99103
Delete(ws.auth.CheckRequestAuth, ws.handlerDeleteMe)
100104
users.
101105
Get("/<uname>", ws.handlerCheckUsername)
106+
users.
107+
Post("/me/pageorder", ws.auth.CheckRequestAuth, ws.handlerPostPageOrder)
102108

103109
pages := api.Group("/pages", ws.addHeaders, rlGlobal, ws.auth.CheckRequestAuth)
104110
pages.

pkg/comparison/istrue.go

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package comparison
2+
3+
import "strings"
4+
5+
func IsTrue(s string) bool {
6+
return s == "1" || strings.ToLower(s) == "true"
7+
}

web/babel.config.js

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1+
/** @format */
2+
13
module.exports = {
2-
presets: [
3-
'@vue/app'
4-
]
5-
}
4+
presets: ['@vue/app'],
5+
};

0 commit comments

Comments
 (0)