Compare commits

..
Author SHA1 Message Date
gisle a5410dff2c Eugh.
the build was successful
2019-05-16 15:57:22 +02:00
gisle 7e3dc49635 Basic stuff, doesn't compile 2019-05-16 15:57:08 +02:00
gisle aff0d99842 graph2: Added exception for open logs query in complexity.
the build was successful
2019-04-27 11:37:01 +02:00
gisle 00150118d2 graph2: Added complexity to prevent queries that can take down the server.
the build was successful
2019-04-25 20:47:20 +02:00
38 changed files with 493 additions and 425 deletions
+3 -7
View File
@@ -1,16 +1,12 @@
## 1. Build Server ## 1. Build Server
# Use Go 1.10 # Use Go 1.12
FROM golang:1.11 AS build-server FROM golang:1.12 AS build-server
# Load repository into docker # Load repository into docker
WORKDIR /go/src/git.aiterp.net/rpdata/api/ WORKDIR /project/
COPY . . COPY . .
RUN rm -rf ./vendor
# Install build tools and dependencies # Install build tools and dependencies
RUN go get -u github.com/golang/dep/cmd/dep
RUN go get -u github.com/vektah/gorunpkg
RUN dep ensure
RUN go generate ./... RUN go generate ./...
# Build server and tools (CGO disabled to make them 100% static) # Build server and tools (CGO disabled to make them 100% static)
Generated
-250
View File
@@ -1,250 +0,0 @@
# This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'.
[[projects]]
name = "github.com/99designs/gqlgen"
packages = [
".",
"cmd",
"codegen",
"codegen/templates",
"complexity",
"graphql",
"graphql/introspection",
"handler",
"internal/gopath"
]
revision = "636435b68700211441303f1a5ed92f3768ba5774"
version = "v0.5.1"
[[projects]]
name = "github.com/agnivade/levenshtein"
packages = ["."]
revision = "3d21ba515fe27b856f230847e856431ae1724adc"
version = "v1.0.0"
[[projects]]
name = "github.com/davecgh/go-spew"
packages = ["spew"]
revision = "8991bc29aa16c548c550c7ff78260e27b9ab7c73"
version = "v1.1.1"
[[projects]]
name = "github.com/dgrijalva/jwt-go"
packages = ["."]
revision = "06ea1031745cb8b3dab3f6a236daf2b0aa468b7e"
version = "v3.2.0"
[[projects]]
branch = "master"
name = "github.com/dustin/go-humanize"
packages = ["."]
revision = "bb3d318650d48840a39aa21a027c6630e198e626"
[[projects]]
branch = "master"
name = "github.com/globalsign/mgo"
packages = [
".",
"bson",
"internal/json",
"internal/sasl",
"internal/scram"
]
revision = "f76e4f9da92ecd56e3be26f5ba92580af1ef97b4"
[[projects]]
name = "github.com/go-ini/ini"
packages = ["."]
revision = "ace140f73450505f33e8b8418216792275ae82a7"
version = "v1.35.0"
[[projects]]
name = "github.com/go-sql-driver/mysql"
packages = ["."]
revision = "d523deb1b23d913de5bdada721a6071e71283618"
version = "v1.4.0"
[[projects]]
name = "github.com/gorilla/websocket"
packages = ["."]
revision = "66b9c49e59c6c48f0ffce28c2d8b8a5678502c6d"
version = "v1.4.0"
[[projects]]
name = "github.com/graph-gophers/dataloader"
packages = ["."]
revision = "78139374585c29dcb97b8f33089ed11959e4be59"
version = "v5"
[[projects]]
name = "github.com/hashicorp/golang-lru"
packages = [
".",
"simplelru"
]
revision = "20f1fb78b0740ba8c3cb143a61e86ba5c8669768"
version = "v0.5.0"
[[projects]]
branch = "master"
name = "github.com/jmoiron/sqlx"
packages = [
".",
"reflectx"
]
revision = "0dae4fefe7c0e190f7b5a78dac28a1c82cc8d849"
[[projects]]
name = "github.com/minio/minio-go"
packages = [
".",
"pkg/credentials",
"pkg/encrypt",
"pkg/s3signer",
"pkg/s3utils",
"pkg/set"
]
revision = "3d2d02921f0510e9d1f66ef77a265b8dddd36992"
version = "6.0.0"
[[projects]]
branch = "master"
name = "github.com/mitchellh/go-homedir"
packages = ["."]
revision = "b8bc1bf767474819792c23f32d8286a45736f1c6"
[[projects]]
name = "github.com/opentracing/opentracing-go"
packages = [
".",
"log"
]
revision = "1949ddbfd147afd4d964a9f00b24eb291e0e7c38"
version = "v1.0.2"
[[projects]]
name = "github.com/pkg/errors"
packages = ["."]
revision = "645ef00459ed84a119197bfb8d8205042c6df63d"
version = "v0.8.0"
[[projects]]
name = "github.com/pmezard/go-difflib"
packages = ["difflib"]
revision = "792786c7400a136282c1664665ae0a8db921c6c2"
version = "v1.0.0"
[[projects]]
name = "github.com/sirupsen/logrus"
packages = ["."]
revision = "c155da19408a8799da419ed3eeb0cb5db0ad5dbc"
version = "v1.0.5"
[[projects]]
name = "github.com/stretchr/testify"
packages = ["assert"]
revision = "f35b8ab0b5a2cef36673838d662e249dd9c94686"
version = "v1.2.2"
[[projects]]
name = "github.com/urfave/cli"
packages = ["."]
revision = "cfb38830724cc34fedffe9a2a29fb54fa9169cd1"
version = "v1.20.0"
[[projects]]
branch = "master"
name = "github.com/vektah/gqlparser"
packages = [
".",
"ast",
"gqlerror",
"lexer",
"parser",
"validator",
"validator/rules"
]
revision = "14e83ae06ec152e6d0afb9766a00e0c0918aa8fc"
[[projects]]
branch = "master"
name = "golang.org/x/crypto"
packages = [
"argon2",
"blake2b",
"ssh/terminal"
]
revision = "d6449816ce06963d9d136eee5a56fca5b0616e7e"
[[projects]]
branch = "master"
name = "golang.org/x/net"
packages = [
"context",
"idna",
"lex/httplex"
]
revision = "a35a21de978d84ffc92f010a153705b170b2f9d1"
[[projects]]
branch = "master"
name = "golang.org/x/sys"
packages = [
"unix",
"windows"
]
revision = "2f57af4873d00d535c5c9028850aa2152e6a5566"
[[projects]]
name = "golang.org/x/text"
packages = [
"collate",
"collate/build",
"internal/colltab",
"internal/gen",
"internal/tag",
"internal/triegen",
"internal/ucd",
"language",
"secure/bidirule",
"transform",
"unicode/bidi",
"unicode/cldr",
"unicode/norm",
"unicode/rangetable"
]
revision = "f21a4dfb5e38f5895301dc265a8def02365cc3d0"
version = "v0.3.0"
[[projects]]
branch = "master"
name = "golang.org/x/tools"
packages = [
"go/ast/astutil",
"go/buildutil",
"go/internal/cgo",
"go/loader",
"imports",
"internal/fastwalk"
]
revision = "677d2ff680c188ddb7dcd2bfa6bc7d3f2f2f75b2"
[[projects]]
name = "google.golang.org/appengine"
packages = ["cloudsql"]
revision = "b1f26356af11148e710935ed1ac8a7f5702c7612"
version = "v1.1.0"
[[projects]]
name = "gopkg.in/yaml.v2"
packages = ["."]
revision = "5420a8b6744d3b0345ab293f6fcba19c978f1183"
version = "v2.2.1"
[solve-meta]
analyzer-name = "dep"
analyzer-version = 1
inputs-digest = "eb8fc099a909f5d8f756b24fbcb6cc2856e132bd3ed16b8fe512f22fabb99596"
solver-name = "gps-cdcl"
solver-version = 1
-43
View File
@@ -1,43 +0,0 @@
# Gopkg.toml example
#
# Refer to https://golang.github.io/dep/docs/Gopkg.toml.html
# for detailed Gopkg.toml documentation.
#
# required = ["github.com/user/thing/cmd/thing"]
# ignored = ["github.com/user/project/pkgX", "bitbucket.org/user/project/pkgA/pkgY"]
#
# [[constraint]]
# name = "github.com/user/project"
# version = "1.0.0"
#
# [[constraint]]
# name = "github.com/user/project2"
# branch = "dev"
# source = "github.com/myfork/project2"
#
# [[override]]
# name = "github.com/x/y"
# version = "2.4.0"
#
# [prune]
# non-go = false
# go-tests = true
# unused-packages = true
required = [ "github.com/99designs/gqlgen" ]
[[constraint]]
branch = "master"
name = "github.com/globalsign/mgo"
[[constraint]]
name = "github.com/minio/minio-go"
version = "6.0.0"
[prune]
go-tests = true
unused-packages = true
[[constraint]]
name = "github.com/stretchr/testify"
version = "1.2.2"
+4 -5
View File
@@ -8,15 +8,13 @@ import (
"runtime/debug" "runtime/debug"
"strings" "strings"
"git.aiterp.net/rpdata/api/models"
"git.aiterp.net/rpdata/api/models/changes"
"git.aiterp.net/rpdata/api/models/logs"
"git.aiterp.net/rpdata/api/graph2" "git.aiterp.net/rpdata/api/graph2"
"git.aiterp.net/rpdata/api/internal/auth" "git.aiterp.net/rpdata/api/internal/auth"
"git.aiterp.net/rpdata/api/internal/loader" "git.aiterp.net/rpdata/api/internal/loader"
"git.aiterp.net/rpdata/api/internal/store" "git.aiterp.net/rpdata/api/internal/store"
"git.aiterp.net/rpdata/api/models"
"git.aiterp.net/rpdata/api/models/changes"
"git.aiterp.net/rpdata/api/models/logs"
"github.com/99designs/gqlgen/handler" "github.com/99designs/gqlgen/handler"
) )
@@ -82,6 +80,7 @@ func queryHandler() http.HandlerFunc {
return fmt.Errorf("The server failed to serve your request due to an internal error, it has been logged") return fmt.Errorf("The server failed to serve your request due to an internal error, it has been logged")
}), }),
handler.ComplexityLimit(300),
) )
return func(w http.ResponseWriter, r *http.Request) { return func(w http.ResponseWriter, r *http.Request) {
+34
View File
@@ -0,0 +1,34 @@
module git.aiterp.net/rpdata/api
go 1.12
require (
github.com/99designs/gqlgen v0.8.0
github.com/agnivade/levenshtein v1.0.1
github.com/davecgh/go-spew v1.1.1
github.com/dgrijalva/jwt-go v3.2.0+incompatible
github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4
github.com/globalsign/mgo v0.0.0-20180403085842-f76e4f9da92e
github.com/go-ini/ini v1.35.0
github.com/go-sql-driver/mysql v1.4.0
github.com/gorilla/websocket v1.4.0
github.com/graph-gophers/dataloader v0.0.0-20180104184831-78139374585c
github.com/hashicorp/golang-lru v0.5.0
github.com/jmoiron/sqlx v0.0.0-20180614180643-0dae4fefe7c0
github.com/minio/minio-go v0.0.0-20180409193742-3d2d02921f05
github.com/mitchellh/go-homedir v0.0.0-20161203194507-b8bc1bf76747
github.com/opentracing/opentracing-go v1.0.2
github.com/pkg/errors v0.8.1
github.com/pmezard/go-difflib v1.0.0
github.com/sirupsen/logrus v1.0.5
github.com/stretchr/testify v1.3.0
github.com/urfave/cli v1.20.0
github.com/vektah/gqlparser v1.1.0
golang.org/x/crypto v0.0.0-20180411161317-d6449816ce06
golang.org/x/net v0.0.0-20180416171110-a35a21de978d
golang.org/x/sys v0.0.0-20180416112224-2f57af4873d0
golang.org/x/text v0.3.0
golang.org/x/tools v0.0.0-20190125232054-d66bd3c5d5a6
google.golang.org/appengine v1.1.0
gopkg.in/yaml.v2 v2.2.2
)
+90
View File
@@ -0,0 +1,90 @@
github.com/99designs/gqlgen v0.5.1 h1:cRsbpZgX83PrXb0/hj5EkNdmaVN4l/Eii81Z8LCexgY=
github.com/99designs/gqlgen v0.5.1/go.mod h1:KSQDfLlTTGmzlRgLGm6HeKKKo598l5E2svEM6Nz2Jnw=
github.com/99designs/gqlgen v0.8.0 h1:ZBteuSgeeFwn+mztjDqQZQdVa9pqslmPnDeCovcnc0Y=
github.com/99designs/gqlgen v0.8.0/go.mod h1:st7qHA6ssU3uRZkmv+wzrzgX4srvIqEIdE5iuRW8GhE=
github.com/99designs/gqlgen v0.8.3 h1:I6bMglXNKkn4KlvkSMzqZw53e1N2FF9Gud4NmsOxqiA=
github.com/99designs/gqlgen v0.8.3/go.mod h1:aLyJw9xUgdJxZ8EqNQxo2pGFhXXJ/hq8t7J4yn8TgI4=
github.com/agnivade/levenshtein v1.0.0 h1:q+77q31bLT5jhN3BHKA1276nUEdbz7XjDa0o5dRKcZ0=
github.com/agnivade/levenshtein v1.0.0/go.mod h1:CURSv5d9Uaml+FovSIICkLbAUZ9S4RqaHDIsdSBg7lM=
github.com/agnivade/levenshtein v1.0.1 h1:3oJU7J3FGFmyhn8KHjmVaZCN5hxTr7GxgRue+sxIXdQ=
github.com/agnivade/levenshtein v1.0.1/go.mod h1:CURSv5d9Uaml+FovSIICkLbAUZ9S4RqaHDIsdSBg7lM=
github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM=
github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
github.com/globalsign/mgo v0.0.0-20180403085842-f76e4f9da92e h1:hmrbHva/wKD6X4M7pgHVbg/KfVV1wwgr1NEkQaVD3rU=
github.com/globalsign/mgo v0.0.0-20180403085842-f76e4f9da92e/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q=
github.com/go-chi/chi v3.3.2+incompatible/go.mod h1:eB3wogJHnLi3x/kFX2A+IbTBlXxmMeXJVKy9tTv1XzQ=
github.com/go-ini/ini v1.35.0 h1:D/my3+xOfqZMkJpciRcyqU7XMBUgiZa9qXjZIa8uv2k=
github.com/go-ini/ini v1.35.0/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8=
github.com/go-sql-driver/mysql v1.4.0 h1:7LxgVwFb2hIQtMm87NdgAVfXjnt4OePseqT1tKx+opk=
github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
github.com/gogo/protobuf v1.0.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
github.com/gorilla/context v0.0.0-20160226214623-1ea25387ff6f/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg=
github.com/gorilla/mux v1.6.1/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
github.com/gorilla/websocket v1.2.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
github.com/gorilla/websocket v1.4.0 h1:WDFjx/TMzVgy9VdMMQi2K2Emtwi2QcUQsztZ/zLaH/Q=
github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
github.com/graph-gophers/dataloader v0.0.0-20180104184831-78139374585c h1:94S+uoVVMpQAEOrqGjCDyUdML4dJDkh6aC4MYmXECg4=
github.com/graph-gophers/dataloader v0.0.0-20180104184831-78139374585c/go.mod h1:jk4jk0c5ZISbKaMe8WsVopGB5/15GvGHMdMdPtwlRp4=
github.com/hashicorp/golang-lru v0.5.0 h1:CL2msUPvZTLb5O648aiLNJw3hnBxN2+1Jq8rCOH9wdo=
github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
github.com/jmoiron/sqlx v0.0.0-20180614180643-0dae4fefe7c0 h1:5B0uxl2lzNRVkJVg+uGHxWtRt4C0Wjc6kJKo5XYx8xE=
github.com/jmoiron/sqlx v0.0.0-20180614180643-0dae4fefe7c0/go.mod h1:IiEW3SEiiErVyFdH8NTuWjSifiEQKUoyK3LNqr2kCHU=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/minio/minio-go v0.0.0-20180409193742-3d2d02921f05 h1:YEyFCqmHcmbcTLqZ7yEAg7VIUat6PuDzGbIctZy888k=
github.com/minio/minio-go v0.0.0-20180409193742-3d2d02921f05/go.mod h1:7guKYtitv8dktvNUGrhzmNlA5wrAABTQXCoesZdFQO8=
github.com/mitchellh/go-homedir v0.0.0-20161203194507-b8bc1bf76747 h1:eQox4Rh4ewJF+mqYPxCkmBAirRnPaHEB26UkNuPyjlk=
github.com/mitchellh/go-homedir v0.0.0-20161203194507-b8bc1bf76747/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
github.com/mitchellh/mapstructure v0.0.0-20180203102830-a4e142e9c047/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74=
github.com/opentracing/opentracing-go v1.0.2 h1:3jA2P6O1F9UOrWVpwrIo17pu01KWvNWg4X946/Y5Zwg=
github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
github.com/pkg/errors v0.8.0 h1:WdK/asTD0HN+q6hsWO3/vpuAkAr+tw6aNJNDFFf0+qw=
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/rs/cors v1.6.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU=
github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo=
github.com/shurcooL/httpfs v0.0.0-20171119174359-809beceb2371/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg=
github.com/shurcooL/vfsgen v0.0.0-20180121065927-ffb13db8def0/go.mod h1:TrYk7fJVaAttu97ZZKrO9UbRa8izdowaMIZcxYMbVaw=
github.com/sirupsen/logrus v1.0.5/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.2.1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/urfave/cli v1.20.0 h1:fDqGv3UG/4jbVl/QkFwEdddtEDjh/5Ov6X+0B/3bPaw=
github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
github.com/vektah/dataloaden v0.2.0/go.mod h1:vxM6NuRlgiR0M6wbVTJeKp9vQIs81ZMfCYO+4yq/jbE=
github.com/vektah/gqlparser v0.0.0-20180831041411-14e83ae06ec1 h1:FYOXUtr3sYR9shto7Q/aQ1B0Onyk77aws9wGOORiz+I=
github.com/vektah/gqlparser v0.0.0-20180831041411-14e83ae06ec1/go.mod h1:K4QdSSpS2XiHHwzb18kWh3iBljB8rLC8okGXsnQy3Nc=
github.com/vektah/gqlparser v1.1.0 h1:3668p2gUlO+PiS81x957Rpr3/FPRWG6cxgCXAvTS1hw=
github.com/vektah/gqlparser v1.1.0/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv3vaXspKw=
github.com/vektah/gqlparser v1.1.2 h1:ZsyLGn7/7jDNI+y4SEhI4yAxRChlv15pUHMjijT+e68=
github.com/vektah/gqlparser v1.1.2/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv3vaXspKw=
golang.org/x/crypto v0.0.0-20180411161317-d6449816ce06 h1:EOqG0JqGlLr+punVB69jvWCv/ErZKGlC7PMdyHfv+Bc=
golang.org/x/crypto v0.0.0-20180411161317-d6449816ce06/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/net v0.0.0-20180404174746-b3c676e531a6/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180416171110-a35a21de978d h1:O2P57H5Cc+d+DJos+iweraI9rmzMYwV+45vkZdDY0Oo=
golang.org/x/net v0.0.0-20180416171110-a35a21de978d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/sys v0.0.0-20180416112224-2f57af4873d0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/tools v0.0.0-20180911133044-677d2ff680c1 h1:dzEuQYa6+a3gROnSlgly5ERUm4SZKJt+dh+4iSbO+bI=
golang.org/x/tools v0.0.0-20180911133044-677d2ff680c1/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190125232054-d66bd3c5d5a6 h1:iZgcI2DDp6zW5v9Z/5+f0NuqoxNdmzg4hivjk2WLXpY=
golang.org/x/tools v0.0.0-20190125232054-d66bd3c5d5a6/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v2 v2.2.1 h1:mUhvW9EsL+naU5Q3cakzfE91YhliOondGd6ZrsDBHQE=
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
sourcegraph.com/sourcegraph/appdash v0.0.0-20180110180208-2cc67fd64755/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU=
sourcegraph.com/sourcegraph/appdash-data v0.0.0-20151005221446-73f23eafcf67/go.mod h1:L5q+DGLGOQFpo1snNEkLOJT2d1YTW66rWNzatr3He1k=
+182
View File
@@ -0,0 +1,182 @@
package graph2
import (
input "git.aiterp.net/rpdata/api/graph2/input"
changes "git.aiterp.net/rpdata/api/models/changes"
channels "git.aiterp.net/rpdata/api/models/channels"
characters "git.aiterp.net/rpdata/api/models/characters"
files "git.aiterp.net/rpdata/api/models/files"
logs "git.aiterp.net/rpdata/api/models/logs"
posts "git.aiterp.net/rpdata/api/models/posts"
stories "git.aiterp.net/rpdata/api/models/stories"
)
func complexity() (cr ComplexityRoot) {
subListComplexity := 25
bigSublistComplexity := 75
hugeSublistComplexity := 100
findComplexity := 100
listComplexity := 200
mutationComplexity := 100
cr.Query.Character = func(childComplexity int, id *string, nick *string) int {
return childComplexity + findComplexity
}
cr.Query.Characters = func(childComplexity int, filter *characters.Filter) int {
return childComplexity + listComplexity
}
cr.Query.Channel = func(childComplexity int, name string) int {
return childComplexity + findComplexity
}
cr.Query.Channels = func(childComplexity int, filter *channels.Filter) int {
return childComplexity + listComplexity
}
cr.Query.Post = func(childComplexity int, id string) int {
return childComplexity + findComplexity
}
cr.Query.Posts = func(childComplexity int, filter *posts.Filter) int {
return childComplexity + listComplexity
}
cr.Query.UnknownNicks = func(childComplexity int, filter *input.UnknownNicksFilter) int {
return childComplexity + listComplexity
}
cr.Query.Log = func(childComplexity int, id string) int {
return childComplexity + findComplexity
}
cr.Query.Logs = func(childComplexity int, filter *logs.Filter) int {
if filter != nil && filter.Open != nil && *filter.Open == true {
return childComplexity + findComplexity
}
return childComplexity + listComplexity
}
cr.Query.Chapter = func(childComplexity int, id string) int {
return childComplexity + findComplexity
}
cr.Query.Comment = func(childComplexity int, id string) int {
return childComplexity + findComplexity
}
cr.Query.Tags = func(childComplexity int) int {
return childComplexity + listComplexity
}
cr.Query.Story = func(childComplexity int, id string) int {
return childComplexity + findComplexity
}
cr.Query.Stories = func(childComplexity int, filter *stories.Filter) int {
return childComplexity + listComplexity
}
cr.Query.File = func(childComplexity int, id string) int {
return childComplexity + findComplexity
}
cr.Query.Files = func(childComplexity int, filter *files.Filter) int {
return childComplexity + listComplexity
}
cr.Query.Changes = func(childComplexity int, filter *changes.Filter) int {
return childComplexity + listComplexity
}
cr.Query.Token = func(childComplexity int) int {
return childComplexity + findComplexity
}
cr.Mutation.AddStory = func(childComplexity int, input input.StoryAddInput) int {
return childComplexity + mutationComplexity
}
cr.Mutation.AddStoryTag = func(childComplexity int, input input.StoryTagAddInput) int {
return childComplexity + mutationComplexity
}
cr.Mutation.RemoveStoryTag = func(childComplexity int, input input.StoryTagRemoveInput) int {
return childComplexity + mutationComplexity
}
cr.Mutation.EditStory = func(childComplexity int, input input.StoryEditInput) int {
return childComplexity + mutationComplexity
}
cr.Mutation.RemoveStory = func(childComplexity int, input input.StoryRemoveInput) int {
return childComplexity + mutationComplexity
}
cr.Mutation.AddChapter = func(childComplexity int, input input.ChapterAddInput) int {
return childComplexity + mutationComplexity
}
cr.Mutation.EditChapter = func(childComplexity int, input input.ChapterEditInput) int {
return childComplexity + mutationComplexity
}
cr.Mutation.MoveChapter = func(childComplexity int, input input.ChapterMoveInput) int {
return childComplexity + mutationComplexity
}
cr.Mutation.RemoveChapter = func(childComplexity int, input input.ChapterRemoveInput) int {
return childComplexity + mutationComplexity
}
cr.Mutation.AddComment = func(childComplexity int, input input.CommentAddInput) int {
return childComplexity + mutationComplexity
}
cr.Mutation.EditComment = func(childComplexity int, input input.CommentEditInput) int {
return childComplexity + mutationComplexity
}
cr.Mutation.RemoveComment = func(childComplexity int, input input.CommentRemoveInput) int {
return childComplexity + mutationComplexity
}
cr.Mutation.AddLog = func(childComplexity int, input input.LogAddInput) int {
return childComplexity + mutationComplexity
}
cr.Mutation.ImportLog = func(childComplexity int, input input.LogImportInput) int {
return childComplexity + mutationComplexity
}
cr.Mutation.EditLog = func(childComplexity int, input input.LogEditInput) int {
return childComplexity + mutationComplexity
}
cr.Mutation.RemoveLog = func(childComplexity int, input input.LogRemoveInput) int {
return childComplexity + mutationComplexity
}
cr.Mutation.AddPost = func(childComplexity int, input input.PostAddInput) int {
return childComplexity + mutationComplexity
}
cr.Mutation.EditPost = func(childComplexity int, input input.PostEditInput) int {
return childComplexity + mutationComplexity
}
cr.Mutation.MovePost = func(childComplexity int, input input.PostMoveInput) int {
return childComplexity + mutationComplexity
}
cr.Mutation.RemovePost = func(childComplexity int, input input.PostRemoveInput) int {
return childComplexity + mutationComplexity
}
cr.Mutation.AddCharacter = func(childComplexity int, input input.CharacterAddInput) int {
return childComplexity + mutationComplexity
}
cr.Mutation.AddCharacterNick = func(childComplexity int, input input.CharacterNickInput) int {
return childComplexity + mutationComplexity
}
cr.Mutation.RemoveCharacterNick = func(childComplexity int, input input.CharacterNickInput) int {
return childComplexity + mutationComplexity
}
cr.Mutation.EditCharacter = func(childComplexity int, input input.CharacterEditInput) int {
return childComplexity + mutationComplexity
}
cr.Mutation.RemoveCharacter = func(childComplexity int, input input.CharacterRemoveInput) int {
return childComplexity + mutationComplexity
}
cr.Mutation.AddChannel = func(childComplexity int, input input.ChannelAddInput) int {
return childComplexity + mutationComplexity
}
cr.Mutation.EditChannel = func(childComplexity int, input input.ChannelEditInput) int {
return childComplexity + mutationComplexity
}
cr.Log.Characters = func(childComplexity int) int {
return childComplexity + subListComplexity
}
cr.Log.Posts = func(childComplexity int, kinds []string) int {
return childComplexity + hugeSublistComplexity
}
cr.Story.Chapters = func(childComplexity int) int {
return childComplexity + bigSublistComplexity
}
cr.Story.Tags = func(childComplexity int) int {
return childComplexity + subListComplexity
}
cr.Chapter.Comments = func(childComplexity int, limit *int) int {
return childComplexity + subListComplexity
}
return
}
+3 -2
View File
@@ -7,12 +7,13 @@ import (
) )
//go:generate ./combine.sh //go:generate ./combine.sh
//go:generate gorunpkg github.com/99designs/gqlgen -v //go:generate go run github.com/99designs/gqlgen -v
// New creates a new GraphQL schema. // New creates a new GraphQL schema.
func New() graphql.ExecutableSchema { func New() graphql.ExecutableSchema {
return NewExecutableSchema(Config{ return NewExecutableSchema(Config{
Resolvers: &rootResolver{}, Resolvers: &rootResolver{},
Complexity: complexity(),
}) })
} }
+9 -9
View File
@@ -14,7 +14,7 @@ import (
// Queries // Queries
func (r *resolver) Channel(ctx context.Context, name string) (models.Channel, error) { func (r *resolver) Channel(ctx context.Context, name string) (*models.Channel, error) {
return channels.FindName(name) return channels.FindName(name)
} }
@@ -24,10 +24,10 @@ func (r *resolver) Channels(ctx context.Context, filter *channels.Filter) ([]mod
// Mutations // Mutations
func (r *mutationResolver) AddChannel(ctx context.Context, input input.ChannelAddInput) (models.Channel, error) { func (r *mutationResolver) AddChannel(ctx context.Context, input input.ChannelAddInput) (*models.Channel, error) {
token := auth.TokenFromContext(ctx) token := auth.TokenFromContext(ctx)
if !token.Authenticated() || !token.Permitted("channel.add") { if !token.Authenticated() || !token.Permitted("channel.add") {
return models.Channel{}, errors.New("You are not permitted to add channels") return nil, errors.New("You are not permitted to add channels")
} }
logged := false logged := false
@@ -49,7 +49,7 @@ func (r *mutationResolver) AddChannel(ctx context.Context, input input.ChannelAd
channel, err := channels.Add(input.Name, logged, hub, eventName, locationName) channel, err := channels.Add(input.Name, logged, hub, eventName, locationName)
if err != nil { if err != nil {
return models.Channel{}, errors.New("Failed to add channel: " + err.Error()) return nil, errors.New("Failed to add channel: " + err.Error())
} }
go changes.Submit("Channel", "add", token.UserID, true, changekeys.Listed(channel), channel) go changes.Submit("Channel", "add", token.UserID, true, changekeys.Listed(channel), channel)
@@ -57,20 +57,20 @@ func (r *mutationResolver) AddChannel(ctx context.Context, input input.ChannelAd
return channel, nil return channel, nil
} }
func (r *mutationResolver) EditChannel(ctx context.Context, input input.ChannelEditInput) (models.Channel, error) { func (r *mutationResolver) EditChannel(ctx context.Context, input input.ChannelEditInput) (*models.Channel, error) {
token := auth.TokenFromContext(ctx) token := auth.TokenFromContext(ctx)
if !token.Authenticated() || !token.Permitted("channel.edit") { if !token.Authenticated() || !token.Permitted("channel.edit") {
return models.Channel{}, errors.New("You are not permitted to edit channels") return nil, errors.New("You are not permitted to edit channels")
} }
channel, err := channels.FindName(input.Name) channel, err := channels.FindName(input.Name)
if err != nil { if err != nil {
return models.Channel{}, errors.New("Channel not found") return nil, errors.New("Channel not found")
} }
channel, err = channels.Edit(channel, input.Logged, input.Hub, input.EventName, input.LocationName) channel, err = channels.Edit(*channel, input.Logged, input.Hub, input.EventName, input.LocationName)
if err != nil { if err != nil {
return models.Channel{}, errors.New("Failed to edit channel: " + err.Error()) return nil, errors.New("Failed to edit channel: " + err.Error())
} }
go changes.Submit("Channel", "edit", token.UserID, true, changekeys.Listed(channel), channel) go changes.Submit("Channel", "edit", token.UserID, true, changekeys.Listed(channel), channel)
+28 -28
View File
@@ -19,34 +19,34 @@ import (
// Queries // Queries
func (r *resolver) Chapter(ctx context.Context, id string) (models.Chapter, error) { func (r *resolver) Chapter(ctx context.Context, id string) (*models.Chapter, error) {
return chapters.FindID(id) return chapters.FindID(id)
} }
// Mutations // Mutations
func (r *mutationResolver) AddChapter(ctx context.Context, input input.ChapterAddInput) (models.Chapter, error) { func (r *mutationResolver) AddChapter(ctx context.Context, input input.ChapterAddInput) (*models.Chapter, error) {
story, err := stories.FindID(input.StoryID) story, err := stories.FindID(input.StoryID)
if err != nil { if err != nil {
return models.Chapter{}, errors.New("Story not found") return nil, errors.New("Story not found")
} }
token := auth.TokenFromContext(ctx) token := auth.TokenFromContext(ctx)
if !token.Permitted("member", "story.add") { if !token.Permitted("member", "story.add") {
return models.Chapter{}, errors.New("Unauthorized") return nil, errors.New("Unauthorized")
} }
author := token.UserID author := token.UserID
if input.Author != nil && *input.Author != author { if input.Author != nil && *input.Author != author {
if !token.Permitted("story.add") { if !token.Permitted("story.add") {
return models.Chapter{}, errors.New("False pretender") return nil, errors.New("False pretender")
} }
author = *input.Author author = *input.Author
} }
if !story.Open && story.Author != author { if !story.Open && story.Author != author {
return models.Chapter{}, errors.New("Story is not open") return nil, errors.New("Story is not open")
} }
commentMode := models.ChapterCommentModeDisabled commentMode := models.ChapterCommentModeDisabled
@@ -54,40 +54,40 @@ func (r *mutationResolver) AddChapter(ctx context.Context, input input.ChapterAd
commentMode = *input.CommentMode commentMode = *input.CommentMode
} }
chapter, err := chapters.Add(story, input.Title, author, input.Source, time.Now(), input.FictionalDate, commentMode) chapter, err := chapters.Add(*story, input.Title, author, input.Source, time.Now(), input.FictionalDate, commentMode)
if err != nil { if err != nil {
return models.Chapter{}, errors.New("Failed to create chapter: " + err.Error()) return nil, errors.New("Failed to create chapter: " + err.Error())
} }
go changes.Submit("Chapter", "add", token.UserID, story.Listed, changekeys.Listed(story, chapter), story, chapter) go changes.Submit("Chapter", "add", token.UserID, story.Listed, changekeys.Listed(story, chapter), story, chapter)
return chapter, nil return &chapter, nil
} }
func (r *mutationResolver) MoveChapter(ctx context.Context, input input.ChapterMoveInput) (models.Chapter, error) { func (r *mutationResolver) MoveChapter(ctx context.Context, input input.ChapterMoveInput) (*models.Chapter, error) {
chapter, err := chapters.FindID(input.ID) chapter, err := chapters.FindID(input.ID)
if err != nil { if err != nil {
return models.Chapter{}, errors.New("Chapter not found") return nil, errors.New("Chapter not found")
} }
token := auth.TokenFromContext(ctx) token := auth.TokenFromContext(ctx)
if !token.Authenticated() || !token.PermittedUser(chapter.Author, "member", "chapter.move") { if !token.Authenticated() || !token.PermittedUser(chapter.Author, "member", "chapter.move") {
return models.Chapter{}, errors.New("You are not allowed to move this chapter") return nil, errors.New("You are not allowed to move this chapter")
} }
target, err := stories.FindID(input.StoryID) target, err := stories.FindID(input.StoryID)
if err != nil { if err != nil {
return models.Chapter{}, errors.New("Target story not found") return nil, errors.New("Target story not found")
} }
if !target.Open && !token.PermittedUser(target.Author, "member", "chapter.move") { if !target.Open && !token.PermittedUser(target.Author, "member", "chapter.move") {
return models.Chapter{}, errors.New("You are not permitted to move chapters to this story") return nil, errors.New("You are not permitted to move chapters to this story")
} }
oldStoryID := chapter.StoryID oldStoryID := chapter.StoryID
chapter, err = chapters.Move(chapter, target) chapter, err = chapters.Move(chapter, *target)
if err != nil { if err != nil {
return models.Chapter{}, errors.New("Failed to move chapter: " + err.Error()) return nil, errors.New("Failed to move chapter: " + err.Error())
} }
go func() { go func() {
@@ -105,18 +105,18 @@ func (r *mutationResolver) MoveChapter(ctx context.Context, input input.ChapterM
changes.Submit("Chapter", "move-in", token.UserID, story.Listed, changekeys.Listed(story, chapter), story, chapter) changes.Submit("Chapter", "move-in", token.UserID, story.Listed, changekeys.Listed(story, chapter), story, chapter)
}() }()
return chapter, nil return &chapter, nil
} }
func (r *mutationResolver) EditChapter(ctx context.Context, input input.ChapterEditInput) (models.Chapter, error) { func (r *mutationResolver) EditChapter(ctx context.Context, input input.ChapterEditInput) (*models.Chapter, error) {
chapter, err := chapters.FindID(input.ID) chapter, err := chapters.FindID(input.ID)
if err != nil { if err != nil {
return models.Chapter{}, errors.New("Chapter not found") return nil, errors.New("Chapter not found")
} }
token := auth.TokenFromContext(ctx) token := auth.TokenFromContext(ctx)
if !token.Authenticated() || !token.PermittedUser(chapter.Author, "member", "chapter.edit") { if !token.Authenticated() || !token.PermittedUser(chapter.Author, "member", "chapter.edit") {
return models.Chapter{}, errors.New("Unauthorized") return nil, errors.New("Unauthorized")
} }
if input.ClearFictionalDate != nil && *input.ClearFictionalDate == true { if input.ClearFictionalDate != nil && *input.ClearFictionalDate == true {
@@ -125,7 +125,7 @@ func (r *mutationResolver) EditChapter(ctx context.Context, input input.ChapterE
chapter, err = chapters.Edit(chapter, input.Title, input.Source, input.FictionalDate, input.CommentMode, input.CommentsLocked) chapter, err = chapters.Edit(chapter, input.Title, input.Source, input.FictionalDate, input.CommentMode, input.CommentsLocked)
if err != nil { if err != nil {
return models.Chapter{}, errors.New("Failed to edit chapter: " + err.Error()) return nil, errors.New("Failed to edit chapter: " + err.Error())
} }
go func() { go func() {
@@ -137,28 +137,28 @@ func (r *mutationResolver) EditChapter(ctx context.Context, input input.ChapterE
changes.Submit("Chapter", "edit", token.UserID, story.Listed, changekeys.Many(story, chapter), chapter) changes.Submit("Chapter", "edit", token.UserID, story.Listed, changekeys.Many(story, chapter), chapter)
}() }()
return chapter, nil return &chapter, nil
} }
func (r *mutationResolver) RemoveChapter(ctx context.Context, input input.ChapterRemoveInput) (models.Chapter, error) { func (r *mutationResolver) RemoveChapter(ctx context.Context, input input.ChapterRemoveInput) (*models.Chapter, error) {
chapter, err := chapters.FindID(input.ID) chapter, err := chapters.FindID(input.ID)
if err != nil { if err != nil {
return models.Chapter{}, errors.New("Chapter not found") return nil, errors.New("Chapter not found")
} }
token := auth.TokenFromContext(ctx) token := auth.TokenFromContext(ctx)
if !token.Authenticated() || !token.PermittedUser(chapter.Author, "member", "chapter.remove") { if !token.Authenticated() || !token.PermittedUser(chapter.Author, "member", "chapter.remove") {
return models.Chapter{}, errors.New("Unauthorized") return nil, errors.New("Unauthorized")
} }
chapter, err = chapters.Remove(chapter) chapter, err = chapters.Remove(chapter)
if err != nil { if err != nil {
return models.Chapter{}, errors.New("Failed to remove chapter: " + err.Error()) return nil, errors.New("Failed to remove chapter: " + err.Error())
} }
err = comments.RemoveChapter(chapter) err = comments.RemoveChapter(chapter)
if err != nil { if err != nil {
return models.Chapter{}, errors.New("Chapter was removed, but comment removal failed: " + err.Error()) return nil, errors.New("Chapter was removed, but comment removal failed: " + err.Error())
} }
go func() { go func() {
@@ -170,5 +170,5 @@ func (r *mutationResolver) RemoveChapter(ctx context.Context, input input.Chapte
changes.Submit("Chapter", "remove", token.UserID, story.Listed, changekeys.Many(story, chapter), chapter) changes.Submit("Chapter", "remove", token.UserID, story.Listed, changekeys.Many(story, chapter), chapter)
}() }()
return chapter, nil return &chapter, nil
} }
+29 -29
View File
@@ -15,7 +15,7 @@ import (
"git.aiterp.net/rpdata/api/models/stories" "git.aiterp.net/rpdata/api/models/stories"
) )
func (r *resolver) Story(ctx context.Context, id string) (models.Story, error) { func (r *resolver) Story(ctx context.Context, id string) (*models.Story, error) {
return stories.FindID(id) return stories.FindID(id)
} }
@@ -38,16 +38,16 @@ func (r *resolver) Stories(ctx context.Context, filter *stories.Filter) ([]model
// Mutations // Mutations
func (r *mutationResolver) AddStory(ctx context.Context, input input.StoryAddInput) (models.Story, error) { func (r *mutationResolver) AddStory(ctx context.Context, input input.StoryAddInput) (*models.Story, error) {
token := auth.TokenFromContext(ctx) token := auth.TokenFromContext(ctx)
if token == nil || !token.Permitted("member", "story.add") { if token == nil || !token.Permitted("member", "story.add") {
return models.Story{}, errors.New("Permission denied") return nil, errors.New("Permission denied")
} }
author := token.UserID author := token.UserID
if input.Author != nil && *input.Author != author { if input.Author != nil && *input.Author != author {
if !token.Permitted("story.add") { if !token.Permitted("story.add") {
return models.Story{}, errors.New("You are not permitted to add a story in another author's name") return nil, errors.New("You are not permitted to add a story in another author's name")
} }
author = *input.Author author = *input.Author
@@ -63,7 +63,7 @@ func (r *mutationResolver) AddStory(ctx context.Context, input input.StoryAddInp
story, err := stories.Add(input.Name, author, input.Category, listed, open, input.Tags, time.Now(), fictionalDate) story, err := stories.Add(input.Name, author, input.Category, listed, open, input.Tags, time.Now(), fictionalDate)
if err != nil { if err != nil {
return models.Story{}, errors.New("Failed to add story: " + err.Error()) return nil, errors.New("Failed to add story: " + err.Error())
} }
go changes.Submit("Story", "add", token.UserID, story.Listed, changekeys.Listed(story), story) go changes.Submit("Story", "add", token.UserID, story.Listed, changekeys.Listed(story), story)
@@ -71,27 +71,27 @@ func (r *mutationResolver) AddStory(ctx context.Context, input input.StoryAddInp
return story, nil return story, nil
} }
func (r *mutationResolver) AddStoryTag(ctx context.Context, input input.StoryTagAddInput) (models.Story, error) { func (r *mutationResolver) AddStoryTag(ctx context.Context, input input.StoryTagAddInput) (*models.Story, error) {
token := auth.TokenFromContext(ctx) token := auth.TokenFromContext(ctx)
story, err := stories.FindID(input.ID) story, err := stories.FindID(input.ID)
if err != nil { if err != nil {
return models.Story{}, errors.New("Story not found") return nil, errors.New("Story not found")
} }
if story.Open { if story.Open {
if !token.Permitted("member") { if !token.Permitted("member") {
return models.Story{}, errors.New("You are not permitted to edit this story") return nil, errors.New("You are not permitted to edit this story")
} }
} else { } else {
if !token.PermittedUser(story.Author, "member", "story.edit") { if !token.PermittedUser(story.Author, "member", "story.edit") {
return models.Story{}, errors.New("You are not permitted to edit this story") return nil, errors.New("You are not permitted to edit this story")
} }
} }
story, err = stories.AddTag(story, input.Tag) story, err = stories.AddTag(*story, input.Tag)
if err != nil { if err != nil {
return models.Story{}, errors.New("Failed to add story: " + err.Error()) return nil, errors.New("Failed to add story: " + err.Error())
} }
go changes.Submit("Story", "tag", token.UserID, story.Listed, changekeys.Listed(story), story, input.Tag) go changes.Submit("Story", "tag", token.UserID, story.Listed, changekeys.Listed(story), story, input.Tag)
@@ -99,27 +99,27 @@ func (r *mutationResolver) AddStoryTag(ctx context.Context, input input.StoryTag
return story, nil return story, nil
} }
func (r *mutationResolver) RemoveStoryTag(ctx context.Context, input input.StoryTagRemoveInput) (models.Story, error) { func (r *mutationResolver) RemoveStoryTag(ctx context.Context, input input.StoryTagRemoveInput) (*models.Story, error) {
token := auth.TokenFromContext(ctx) token := auth.TokenFromContext(ctx)
story, err := stories.FindID(input.ID) story, err := stories.FindID(input.ID)
if err != nil { if err != nil {
return models.Story{}, errors.New("Story not found") return nil, errors.New("Story not found")
} }
if story.Open { if story.Open {
if !token.Permitted("member") { if !token.Permitted("member") {
return models.Story{}, errors.New("You are not permitted to edit this story") return nil, errors.New("You are not permitted to edit this story")
} }
} else { } else {
if !token.PermittedUser(story.Author, "member", "story.edit") { if !token.PermittedUser(story.Author, "member", "story.edit") {
return models.Story{}, errors.New("You are not permitted to edit this story") return nil, errors.New("You are not permitted to edit this story")
} }
} }
story, err = stories.RemoveTag(story, input.Tag) story, err = stories.RemoveTag(*story, input.Tag)
if err != nil { if err != nil {
return models.Story{}, errors.New("Failed to add story: " + err.Error()) return nil, errors.New("Failed to add story: " + err.Error())
} }
go changes.Submit("Story", "untag", token.UserID, story.Listed, changekeys.Listed(story), story, input.Tag) go changes.Submit("Story", "untag", token.UserID, story.Listed, changekeys.Listed(story), story, input.Tag)
@@ -127,25 +127,25 @@ func (r *mutationResolver) RemoveStoryTag(ctx context.Context, input input.Story
return story, nil return story, nil
} }
func (r *mutationResolver) EditStory(ctx context.Context, input input.StoryEditInput) (models.Story, error) { func (r *mutationResolver) EditStory(ctx context.Context, input input.StoryEditInput) (*models.Story, error) {
token := auth.TokenFromContext(ctx) token := auth.TokenFromContext(ctx)
story, err := stories.FindID(input.ID) story, err := stories.FindID(input.ID)
if err != nil { if err != nil {
return models.Story{}, errors.New("Story not found") return nil, errors.New("Story not found")
} }
if !token.PermittedUser(story.Author, "member", "story.edit") { if !token.PermittedUser(story.Author, "member", "story.edit") {
return models.Story{}, errors.New("You are not permitted to remove this story") return nil, errors.New("You are not permitted to remove this story")
} }
if input.ClearFictionalDate != nil && *input.ClearFictionalDate { if input.ClearFictionalDate != nil && *input.ClearFictionalDate {
input.FictionalDate = &time.Time{} input.FictionalDate = &time.Time{}
} }
story, err = stories.Edit(story, input.Name, input.Category, input.Listed, input.Open, input.FictionalDate) story, err = stories.Edit(*story, input.Name, input.Category, input.Listed, input.Open, input.FictionalDate)
if err != nil { if err != nil {
return models.Story{}, errors.New("Failed to add story: " + err.Error()) return nil, errors.New("Failed to add story: " + err.Error())
} }
go changes.Submit("Story", "edit", token.UserID, story.Listed, changekeys.Listed(story), story) go changes.Submit("Story", "edit", token.UserID, story.Listed, changekeys.Listed(story), story)
@@ -153,26 +153,26 @@ func (r *mutationResolver) EditStory(ctx context.Context, input input.StoryEditI
return story, nil return story, nil
} }
func (r *mutationResolver) RemoveStory(ctx context.Context, input input.StoryRemoveInput) (models.Story, error) { func (r *mutationResolver) RemoveStory(ctx context.Context, input input.StoryRemoveInput) (*models.Story, error) {
token := auth.TokenFromContext(ctx) token := auth.TokenFromContext(ctx)
story, err := stories.FindID(input.ID) story, err := stories.FindID(input.ID)
if err != nil { if err != nil {
return models.Story{}, errors.New("Story not found") return nil, errors.New("Story not found")
} }
if !token.PermittedUser(story.Author, "member", "story.remove") { if !token.PermittedUser(story.Author, "member", "story.remove") {
return models.Story{}, errors.New("You are not permitted to remove this story") return nil, errors.New("You are not permitted to remove this story")
} }
story, err = stories.Remove(story) story, err = stories.Remove(*story)
if err != nil { if err != nil {
return models.Story{}, err return nil, err
} }
err = chapters.RemoveStory(story) err = chapters.RemoveStory(*story)
if err != nil { if err != nil {
return models.Story{}, errors.New("Failed to remove chapters, but story is removed: " + err.Error()) return nil, errors.New("Failed to remove chapters, but story is removed: " + err.Error())
} }
go changes.Submit("Story", "remove", token.UserID, story.Listed, changekeys.Listed(story), story) go changes.Submit("Story", "remove", token.UserID, story.Listed, changekeys.Listed(story), story)
+8 -3
View File
@@ -2,6 +2,7 @@ package types
import ( import (
"context" "context"
"log"
"git.aiterp.net/rpdata/api/graph2/input" "git.aiterp.net/rpdata/api/graph2/input"
"git.aiterp.net/rpdata/api/models" "git.aiterp.net/rpdata/api/models"
@@ -12,9 +13,13 @@ type changeResolver struct{}
func (r *changeResolver) Objects(ctx context.Context, obj *models.Change) ([]input.ChangeObject, error) { func (r *changeResolver) Objects(ctx context.Context, obj *models.Change) ([]input.ChangeObject, error) {
objects := obj.Objects() objects := obj.Objects()
results := make([]input.ChangeObject, len(objects)) results := make([]input.ChangeObject, 0, len(objects))
for i := range objects { for _, object := range objects {
results[i] = objects[i] if cObj, ok := object.(input.ChangeObject); ok {
results = append(results, cObj)
} else {
log.Printf("Warning: %T is not a change object", object)
}
} }
return results, nil return results, nil
+5
View File
@@ -8,3 +8,8 @@ type Channel struct {
EventName string `bson:"eventName,omitempty"` EventName string `bson:"eventName,omitempty"`
LocationName string `bson:"locationName,omitempty"` LocationName string `bson:"locationName,omitempty"`
} }
// IsChangeObject is a dummy interface implementation
func (*Channel) IsChangeObject() {
// Dummy interface implementation
}
+4 -4
View File
@@ -11,9 +11,9 @@ import (
var ErrInvalidName = errors.New("Invalid channel name") var ErrInvalidName = errors.New("Invalid channel name")
// Add creates a new channel. // Add creates a new channel.
func Add(name string, logged, hub bool, event, location string) (models.Channel, error) { func Add(name string, logged, hub bool, event, location string) (*models.Channel, error) {
if len(name) < 3 && !strings.HasPrefix(name, "#") { if len(name) < 3 && !strings.HasPrefix(name, "#") {
return models.Channel{}, ErrInvalidName return nil, ErrInvalidName
} }
channel := models.Channel{ channel := models.Channel{
@@ -26,8 +26,8 @@ func Add(name string, logged, hub bool, event, location string) (models.Channel,
err := collection.Insert(channel) err := collection.Insert(channel)
if err != nil { if err != nil {
return models.Channel{}, err return nil, err
} }
return channel, nil return &channel, nil
} }
+4 -4
View File
@@ -6,7 +6,7 @@ import (
) )
// Edit edits a channels // Edit edits a channels
func Edit(channel models.Channel, logged, hub *bool, eventName, locationName *string) (models.Channel, error) { func Edit(channel models.Channel, logged, hub *bool, eventName, locationName *string) (*models.Channel, error) {
mutation := bson.M{} mutation := bson.M{}
if logged != nil && *logged != channel.Logged { if logged != nil && *logged != channel.Logged {
@@ -27,13 +27,13 @@ func Edit(channel models.Channel, logged, hub *bool, eventName, locationName *st
} }
if len(mutation) == 0 { if len(mutation) == 0 {
return channel, nil return &channel, nil
} }
err := collection.UpdateId(channel.Name, bson.M{"$set": mutation}) err := collection.UpdateId(channel.Name, bson.M{"$set": mutation})
if err != nil { if err != nil {
return models.Channel{}, err return nil, err
} }
return channel, nil return &channel, nil
} }
+5 -5
View File
@@ -10,22 +10,22 @@ import (
// Ensure adds a channel if it doesn't exist. If logged is set and the found channel isn't logged, // Ensure adds a channel if it doesn't exist. If logged is set and the found channel isn't logged,
// that is changed. // that is changed.
func Ensure(name string, logged bool) (models.Channel, error) { func Ensure(name string, logged bool) (*models.Channel, error) {
if len(name) < 3 && !strings.HasPrefix(name, "#") { if len(name) < 3 && !strings.HasPrefix(name, "#") {
return models.Channel{}, ErrInvalidName return nil, ErrInvalidName
} }
channel, err := FindName(name) channel, err := FindName(name)
if err == mgo.ErrNotFound { if err == mgo.ErrNotFound {
return Add(name, logged, false, "", "") return Add(name, logged, false, "", "")
} else if err != nil { } else if err != nil {
return models.Channel{}, err return nil, err
} }
if logged && !channel.Logged { if logged && !channel.Logged {
channel, err = Edit(channel, &logged, nil, nil, nil) channel, err = Edit(*channel, &logged, nil, nil, nil)
if err != nil { if err != nil {
return models.Channel{}, err return nil, err
} }
} }
+5 -2
View File
@@ -3,9 +3,12 @@ package channels
import "git.aiterp.net/rpdata/api/models" import "git.aiterp.net/rpdata/api/models"
// FindName finds a channel by its id (its name). // FindName finds a channel by its id (its name).
func FindName(name string) (models.Channel, error) { func FindName(name string) (*models.Channel, error) {
channel := models.Channel{} channel := models.Channel{}
err := collection.FindId(name).One(&channel) err := collection.FindId(name).One(&channel)
if err != nil {
return nil, err
}
return channel, err return &channel, nil
} }
+5
View File
@@ -20,3 +20,8 @@ type Chapter struct {
func (chapter *Chapter) CanComment() bool { func (chapter *Chapter) CanComment() bool {
return !chapter.CommentsLocked && chapter.CommentMode.IsEnabled() return !chapter.CommentsLocked && chapter.CommentMode.IsEnabled()
} }
// IsChangeObject is a dummy interface implementation
func (*Chapter) IsChangeObject() {
// Dummy interface implementation
}
+3 -3
View File
@@ -8,7 +8,7 @@ import (
) )
// Add adds a new chapter. // Add adds a new chapter.
func Add(story models.Story, title, author, source string, createdDate time.Time, finctionalDate *time.Time, commentMode models.ChapterCommentMode) (models.Chapter, error) { func Add(story models.Story, title, author, source string, createdDate time.Time, finctionalDate *time.Time, commentMode models.ChapterCommentMode) (*models.Chapter, error) {
chapter := models.Chapter{ chapter := models.Chapter{
ID: makeChapterID(), ID: makeChapterID(),
StoryID: story.ID, StoryID: story.ID,
@@ -27,7 +27,7 @@ func Add(story models.Story, title, author, source string, createdDate time.Time
err := collection.Insert(chapter) err := collection.Insert(chapter)
if err != nil { if err != nil {
return models.Chapter{}, err return nil, err
} }
if createdDate.After(story.UpdatedDate) { if createdDate.After(story.UpdatedDate) {
@@ -36,5 +36,5 @@ func Add(story models.Story, title, author, source string, createdDate time.Time
} }
} }
return chapter, nil return &chapter, nil
} }
+5 -2
View File
@@ -13,11 +13,14 @@ import (
var collection *mgo.Collection var collection *mgo.Collection
var storyCollection *mgo.Collection var storyCollection *mgo.Collection
func find(query interface{}) (models.Chapter, error) { func find(query interface{}) (*models.Chapter, error) {
chapter := models.Chapter{} chapter := models.Chapter{}
err := collection.Find(query).One(&chapter) err := collection.Find(query).One(&chapter)
if err != nil {
return nil, err
}
return chapter, err return &chapter, err
} }
func list(query interface{}) ([]models.Chapter, error) { func list(query interface{}) ([]models.Chapter, error) {
+3 -3
View File
@@ -9,7 +9,7 @@ import (
// Edit edits a chapter, and updates EditedDate. While many Edit functions cheat if there's nothing to // Edit edits a chapter, and updates EditedDate. While many Edit functions cheat if there's nothing to
// change, this functill will due to EditedDate. // change, this functill will due to EditedDate.
func Edit(chapter models.Chapter, title, source *string, fictionalDate *time.Time, commentMode *models.ChapterCommentMode, commentsLocked *bool) (models.Chapter, error) { func Edit(chapter models.Chapter, title, source *string, fictionalDate *time.Time, commentMode *models.ChapterCommentMode, commentsLocked *bool) (*models.Chapter, error) {
now := time.Now() now := time.Now()
changes := bson.M{"editedDate": now} changes := bson.M{"editedDate": now}
@@ -39,8 +39,8 @@ func Edit(chapter models.Chapter, title, source *string, fictionalDate *time.Tim
err := collection.UpdateId(chapter.ID, bson.M{"$set": changes}) err := collection.UpdateId(chapter.ID, bson.M{"$set": changes})
if err != nil { if err != nil {
return chapter, err return nil, err
} }
return edited, nil return &edited, nil
} }
+1 -1
View File
@@ -6,6 +6,6 @@ import (
) )
// FindID finds a chapter by ID // FindID finds a chapter by ID
func FindID(id string) (models.Chapter, error) { func FindID(id string) (*models.Chapter, error) {
return find(bson.M{"_id": id}) return find(bson.M{"_id": id})
} }
+3 -3
View File
@@ -8,12 +8,12 @@ import (
) )
// Move updates the chapter, moving it to the given story. // Move updates the chapter, moving it to the given story.
func Move(chapter models.Chapter, story models.Story) (models.Chapter, error) { func Move(chapter models.Chapter, story models.Story) (*models.Chapter, error) {
now := time.Now() now := time.Now()
err := collection.UpdateId(chapter.ID, bson.M{"$set": bson.M{"editedDate": now, "storyId": story.ID}}) err := collection.UpdateId(chapter.ID, bson.M{"$set": bson.M{"editedDate": now, "storyId": story.ID}})
if err != nil { if err != nil {
return models.Chapter{}, err return nil, err
} }
chapter.EditedDate = now chapter.EditedDate = now
@@ -24,5 +24,5 @@ func Move(chapter models.Chapter, story models.Story) (models.Chapter, error) {
} }
} }
return chapter, nil return &chapter, nil
} }
+2 -2
View File
@@ -6,9 +6,9 @@ import (
) )
// Remove removes a chapter. // Remove removes a chapter.
func Remove(chapter models.Chapter) (models.Chapter, error) { func Remove(chapter models.Chapter) (*models.Chapter, error) {
if err := collection.RemoveId(chapter.ID); err != nil { if err := collection.RemoveId(chapter.ID); err != nil {
return models.Chapter{}, err return nil, err
} }
return chapter, nil return chapter, nil
+5
View File
@@ -29,3 +29,8 @@ func (character *Character) HasNick(nick string) bool {
return false return false
} }
// IsChangeObject is a dummy interface implementation
func (*Character) IsChangeObject() {
// Dummy interface implementation
}
+5
View File
@@ -15,3 +15,8 @@ type Comment struct {
EditedDate time.Time `bson:"editeddDate"` EditedDate time.Time `bson:"editeddDate"`
Source string `bson:"source"` Source string `bson:"source"`
} }
// IsChangeObject is a dummy interface implementation
func (*Comment) IsChangeObject() {
// Dummy interface implementation
}
+5
View File
@@ -14,3 +14,8 @@ type File struct {
Author string `bson:"author" json:"author"` Author string `bson:"author" json:"author"`
URL string `bson:"url,omitempty" json:"url,omitempty"` URL string `bson:"url,omitempty" json:"url,omitempty"`
} }
// IsChangeObject is a dummy interface implementation
func (*File) IsChangeObject() {
// Dummy interface implementation
}
+5
View File
@@ -14,3 +14,8 @@ type Log struct {
Open bool `bson:"open"` Open bool `bson:"open"`
CharacterIDs []string `bson:"characterIds"` CharacterIDs []string `bson:"characterIds"`
} }
// IsChangeObject is a dummy interface implementation
func (*Log) IsChangeObject() {
// Dummy interface implementation
}
+5
View File
@@ -12,3 +12,8 @@ type Post struct {
Text string `bson:"text"` Text string `bson:"text"`
Position int `bson:"position"` Position int `bson:"position"`
} }
// IsChangeObject is a dummy interface implementation
func (*Post) IsChangeObject() {
// Dummy interface implementation
}
+4 -4
View File
@@ -11,19 +11,19 @@ import (
var ErrTagAlreadyExists = errors.New("Tag already exists on story") var ErrTagAlreadyExists = errors.New("Tag already exists on story")
// AddTag adds a tag to the story. It returns ErrTagAlreadyExists if the tag is already there // AddTag adds a tag to the story. It returns ErrTagAlreadyExists if the tag is already there
func AddTag(story models.Story, tag models.Tag) (models.Story, error) { func AddTag(story models.Story, tag models.Tag) (*models.Story, error) {
for i := range story.Tags { for i := range story.Tags {
if story.Tags[i].Equal(tag) { if story.Tags[i].Equal(tag) {
return models.Story{}, ErrTagAlreadyExists return nil, ErrTagAlreadyExists
} }
} }
err := collection.UpdateId(story.ID, bson.M{"$push": bson.M{"tags": tag}}) err := collection.UpdateId(story.ID, bson.M{"$push": bson.M{"tags": tag}})
if err != nil { if err != nil {
return models.Story{}, err return nil, err
} }
story.Tags = append(story.Tags, tag) story.Tags = append(story.Tags, tag)
return story, nil return &story, nil
} }
+3 -3
View File
@@ -7,7 +7,7 @@ import (
) )
// Add creates a new story. // Add creates a new story.
func Add(name, author string, category models.StoryCategory, listed, open bool, tags []models.Tag, createdDate, fictionalDate time.Time) (models.Story, error) { func Add(name, author string, category models.StoryCategory, listed, open bool, tags []models.Tag, createdDate, fictionalDate time.Time) (*models.Story, error) {
story := models.Story{ story := models.Story{
ID: makeStoryID(), ID: makeStoryID(),
Name: name, Name: name,
@@ -23,8 +23,8 @@ func Add(name, author string, category models.StoryCategory, listed, open bool,
err := collection.Insert(story) err := collection.Insert(story)
if err != nil { if err != nil {
return models.Story{}, err return nil, err
} }
return story, nil return &story, nil
} }
+5 -2
View File
@@ -12,11 +12,14 @@ import (
var collection *mgo.Collection var collection *mgo.Collection
func find(query interface{}) (models.Story, error) { func find(query interface{}) (*models.Story, error) {
story := models.Story{} story := models.Story{}
err := collection.Find(query).One(&story) err := collection.Find(query).One(&story)
if err != nil {
return nil, err
}
return story, err return &story, err
} }
func list(query interface{}, limit int) ([]models.Story, error) { func list(query interface{}, limit int) ([]models.Story, error) {
+4 -4
View File
@@ -8,7 +8,7 @@ import (
) )
// Edit edits the story and returns the edited story if it succeeds. // Edit edits the story and returns the edited story if it succeeds.
func Edit(story models.Story, name *string, category *models.StoryCategory, listed, open *bool, fictionalDate *time.Time) (models.Story, error) { func Edit(story models.Story, name *string, category *models.StoryCategory, listed, open *bool, fictionalDate *time.Time) (*models.Story, error) {
changes := bson.M{} changes := bson.M{}
if name != nil && *name != story.Name { if name != nil && *name != story.Name {
@@ -33,13 +33,13 @@ func Edit(story models.Story, name *string, category *models.StoryCategory, list
} }
if len(changes) == 0 { if len(changes) == 0 {
return story, nil return &story, nil
} }
err := collection.UpdateId(story.ID, bson.M{"$set": changes}) err := collection.UpdateId(story.ID, bson.M{"$set": changes})
if err != nil { if err != nil {
return models.Story{}, err return nil, err
} }
return story, nil return &story, nil
} }
+1 -1
View File
@@ -6,6 +6,6 @@ import (
) )
// FindID finds a story by ID // FindID finds a story by ID
func FindID(id string) (models.Story, error) { func FindID(id string) (*models.Story, error) {
return find(bson.M{"_id": id}) return find(bson.M{"_id": id})
} }
+4 -4
View File
@@ -11,7 +11,7 @@ import (
var ErrTagNotExists = errors.New("Tag does not exist on story") var ErrTagNotExists = errors.New("Tag does not exist on story")
// RemoveTag removes a tag to the story. It returns ErrTagNotExists if the tag does not exist. // RemoveTag removes a tag to the story. It returns ErrTagNotExists if the tag does not exist.
func RemoveTag(story models.Story, tag models.Tag) (models.Story, error) { func RemoveTag(story models.Story, tag models.Tag) (*models.Story, error) {
index := -1 index := -1
for i := range story.Tags { for i := range story.Tags {
if story.Tags[i].Equal(tag) { if story.Tags[i].Equal(tag) {
@@ -20,15 +20,15 @@ func RemoveTag(story models.Story, tag models.Tag) (models.Story, error) {
} }
} }
if index == -1 { if index == -1 {
return models.Story{}, ErrTagNotExists return nil, ErrTagNotExists
} }
err := collection.UpdateId(story.ID, bson.M{"$pull": bson.M{"tags": tag}}) err := collection.UpdateId(story.ID, bson.M{"$pull": bson.M{"tags": tag}})
if err != nil { if err != nil {
return models.Story{}, err return nil, err
} }
story.Tags = append(story.Tags[:index], story.Tags[index+1:]...) story.Tags = append(story.Tags[:index], story.Tags[index+1:]...)
return story, nil return &story, nil
} }
+2 -2
View File
@@ -5,6 +5,6 @@ import (
) )
// Remove the story from the database // Remove the story from the database
func Remove(story models.Story) (models.Story, error) { func Remove(story models.Story) (*models.Story, error) {
return story, collection.RemoveId(story.ID) return &story, collection.RemoveId(story.ID)
} }
+5
View File
@@ -16,3 +16,8 @@ type Story struct {
FictionalDate time.Time `bson:"fictionalDate,omitempty"` FictionalDate time.Time `bson:"fictionalDate,omitempty"`
UpdatedDate time.Time `bson:"updatedDate"` UpdatedDate time.Time `bson:"updatedDate"`
} }
// IsChangeObject is a dummy interface implementation
func (*Story) IsChangeObject() {
// Dummy interface implementation
}
+5
View File
@@ -10,3 +10,8 @@ type Tag struct {
func (tag *Tag) Equal(other Tag) bool { func (tag *Tag) Equal(other Tag) bool {
return tag.Kind == other.Kind && tag.Name == other.Name return tag.Kind == other.Kind && tag.Name == other.Name
} }
// IsChangeObject is a dummy interface implementation
func (*Tag) IsChangeObject() {
// Dummy interface implementation
}