api: Update graphql schema

This commit is contained in:
Kevin Kandlbinder 2022-03-24 16:35:45 +01:00
parent 39f721101e
commit 4f587820d1
9 changed files with 578 additions and 200 deletions

View file

@ -110,15 +110,15 @@ type ComplexityRoot struct {
Mutation struct { Mutation struct {
AddMxid func(childComplexity int, input model.AddMxid) int AddMxid func(childComplexity int, input model.AddMxid) int
AddToList func(childComplexity int, input model.AddToList) int AddToLists func(childComplexity int, input model.AddToLists) int
CommentEntry func(childComplexity int, input model.CommentEntry) int CommentEntry func(childComplexity int, input model.CommentEntry) int
CommentList func(childComplexity int, input model.CommentList) int CommentList func(childComplexity int, input model.CommentList) int
CreateEntry func(childComplexity int, input model.CreateEntry) int CreateEntry func(childComplexity int, input model.CreateEntry) int
CreateList func(childComplexity int, input model.CreateList) int CreateList func(childComplexity int, input model.CreateList) int
DeleteEntry func(childComplexity int, input string) int
DeleteList func(childComplexity int, input string) int DeleteList func(childComplexity int, input string) int
Login func(childComplexity int, input model.Login) int Login func(childComplexity int, input model.Login) int
Register func(childComplexity int, input model.Register) int Register func(childComplexity int, input model.Register) int
RemoveFromLists func(childComplexity int, input model.RemoveFromLists) int
RemoveMxid func(childComplexity int, input model.RemoveMxid) int RemoveMxid func(childComplexity int, input model.RemoveMxid) int
} }
@ -180,10 +180,10 @@ type MutationResolver interface {
RemoveMxid(ctx context.Context, input model.RemoveMxid) (*model.User, error) RemoveMxid(ctx context.Context, input model.RemoveMxid) (*model.User, error)
CreateEntry(ctx context.Context, input model.CreateEntry) (*model.Entry, error) CreateEntry(ctx context.Context, input model.CreateEntry) (*model.Entry, error)
CommentEntry(ctx context.Context, input model.CommentEntry) (*model.Entry, error) CommentEntry(ctx context.Context, input model.CommentEntry) (*model.Entry, error)
DeleteEntry(ctx context.Context, input string) (bool, error) AddToLists(ctx context.Context, input model.AddToLists) (*model.Entry, error)
RemoveFromLists(ctx context.Context, input model.RemoveFromLists) (*model.Entry, error)
CreateList(ctx context.Context, input model.CreateList) (*model.List, error) CreateList(ctx context.Context, input model.CreateList) (*model.List, error)
CommentList(ctx context.Context, input model.CommentList) (*model.List, error) CommentList(ctx context.Context, input model.CommentList) (*model.List, error)
AddToList(ctx context.Context, input model.AddToList) (*model.List, error)
DeleteList(ctx context.Context, input string) (bool, error) DeleteList(ctx context.Context, input string) (bool, error)
} }
type QueryResolver interface { type QueryResolver interface {
@ -451,17 +451,17 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in
return e.complexity.Mutation.AddMxid(childComplexity, args["input"].(model.AddMxid)), true return e.complexity.Mutation.AddMxid(childComplexity, args["input"].(model.AddMxid)), true
case "Mutation.addToList": case "Mutation.addToLists":
if e.complexity.Mutation.AddToList == nil { if e.complexity.Mutation.AddToLists == nil {
break break
} }
args, err := ec.field_Mutation_addToList_args(context.TODO(), rawArgs) args, err := ec.field_Mutation_addToLists_args(context.TODO(), rawArgs)
if err != nil { if err != nil {
return 0, false return 0, false
} }
return e.complexity.Mutation.AddToList(childComplexity, args["input"].(model.AddToList)), true return e.complexity.Mutation.AddToLists(childComplexity, args["input"].(model.AddToLists)), true
case "Mutation.commentEntry": case "Mutation.commentEntry":
if e.complexity.Mutation.CommentEntry == nil { if e.complexity.Mutation.CommentEntry == nil {
@ -511,18 +511,6 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in
return e.complexity.Mutation.CreateList(childComplexity, args["input"].(model.CreateList)), true return e.complexity.Mutation.CreateList(childComplexity, args["input"].(model.CreateList)), true
case "Mutation.deleteEntry":
if e.complexity.Mutation.DeleteEntry == nil {
break
}
args, err := ec.field_Mutation_deleteEntry_args(context.TODO(), rawArgs)
if err != nil {
return 0, false
}
return e.complexity.Mutation.DeleteEntry(childComplexity, args["input"].(string)), true
case "Mutation.deleteList": case "Mutation.deleteList":
if e.complexity.Mutation.DeleteList == nil { if e.complexity.Mutation.DeleteList == nil {
break break
@ -559,6 +547,18 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in
return e.complexity.Mutation.Register(childComplexity, args["input"].(model.Register)), true return e.complexity.Mutation.Register(childComplexity, args["input"].(model.Register)), true
case "Mutation.removeFromLists":
if e.complexity.Mutation.RemoveFromLists == nil {
break
}
args, err := ec.field_Mutation_removeFromLists_args(context.TODO(), rawArgs)
if err != nil {
return 0, false
}
return e.complexity.Mutation.RemoveFromLists(childComplexity, args["input"].(model.RemoveFromLists)), true
case "Mutation.removeMXID": case "Mutation.removeMXID":
if e.complexity.Mutation.RemoveMxid == nil { if e.complexity.Mutation.RemoveMxid == nil {
break break
@ -846,7 +846,7 @@ type User {
admin: Boolean admin: Boolean
matrixLinks: [String!] matrixLinks: [String!]
pendingMatrixLinks: [String!] @owner pendingMatrixLinks: [String!]
} }
type UserConnection { type UserConnection {
@ -1053,9 +1053,14 @@ input CommentList {
comment: String! comment: String!
} }
input AddToList { input AddToLists {
list: ID! lists: [ID!]!
entries: [ID!]! entry: ID!
}
input RemoveFromLists {
lists: [ID!]!
entry: ID!
} }
input AddMXID { input AddMXID {
@ -1074,11 +1079,11 @@ type Mutation {
createEntry(input: CreateEntry!): Entry! @loggedIn createEntry(input: CreateEntry!): Entry! @loggedIn
commentEntry(input: CommentEntry!): Entry! @loggedIn commentEntry(input: CommentEntry!): Entry! @loggedIn
deleteEntry(input: ID!): Boolean! @loggedIn @hasRole(role: ADMIN) addToLists(input: AddToLists!): Entry! @loggedIn
removeFromLists(input: RemoveFromLists!): Entry! @loggedIn
createList(input: CreateList!): List! @loggedIn createList(input: CreateList!): List! @loggedIn
commentList(input: CommentList!): List! @loggedIn commentList(input: CommentList!): List! @loggedIn
addToList(input: AddToList!): List! @loggedIn @maintainer
deleteList(input: ID!): Boolean! @loggedIn @owner deleteList(input: ID!): Boolean! @loggedIn @owner
} }
@ -1240,13 +1245,13 @@ func (ec *executionContext) field_Mutation_addMXID_args(ctx context.Context, raw
return args, nil return args, nil
} }
func (ec *executionContext) field_Mutation_addToList_args(ctx context.Context, rawArgs map[string]interface{}) (map[string]interface{}, error) { func (ec *executionContext) field_Mutation_addToLists_args(ctx context.Context, rawArgs map[string]interface{}) (map[string]interface{}, error) {
var err error var err error
args := map[string]interface{}{} args := map[string]interface{}{}
var arg0 model.AddToList var arg0 model.AddToLists
if tmp, ok := rawArgs["input"]; ok { if tmp, ok := rawArgs["input"]; ok {
ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("input")) ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("input"))
arg0, err = ec.unmarshalNAddToList2githubᚗcomᚋUnkn0wnCatᚋmatrixᚑvelesᚋgraphᚋmodelᚐAddToList(ctx, tmp) arg0, err = ec.unmarshalNAddToLists2githubᚗcomᚋUnkn0wnCatᚋmatrixᚑvelesᚋgraphᚋmodelᚐAddToLists(ctx, tmp)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -1315,21 +1320,6 @@ func (ec *executionContext) field_Mutation_createList_args(ctx context.Context,
return args, nil return args, nil
} }
func (ec *executionContext) field_Mutation_deleteEntry_args(ctx context.Context, rawArgs map[string]interface{}) (map[string]interface{}, error) {
var err error
args := map[string]interface{}{}
var arg0 string
if tmp, ok := rawArgs["input"]; ok {
ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("input"))
arg0, err = ec.unmarshalNID2string(ctx, tmp)
if err != nil {
return nil, err
}
}
args["input"] = arg0
return args, nil
}
func (ec *executionContext) field_Mutation_deleteList_args(ctx context.Context, rawArgs map[string]interface{}) (map[string]interface{}, error) { func (ec *executionContext) field_Mutation_deleteList_args(ctx context.Context, rawArgs map[string]interface{}) (map[string]interface{}, error) {
var err error var err error
args := map[string]interface{}{} args := map[string]interface{}{}
@ -1375,6 +1365,21 @@ func (ec *executionContext) field_Mutation_register_args(ctx context.Context, ra
return args, nil return args, nil
} }
func (ec *executionContext) field_Mutation_removeFromLists_args(ctx context.Context, rawArgs map[string]interface{}) (map[string]interface{}, error) {
var err error
args := map[string]interface{}{}
var arg0 model.RemoveFromLists
if tmp, ok := rawArgs["input"]; ok {
ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("input"))
arg0, err = ec.unmarshalNRemoveFromLists2githubᚗcomᚋUnkn0wnCatᚋmatrixᚑvelesᚋgraphᚋmodelᚐRemoveFromLists(ctx, tmp)
if err != nil {
return nil, err
}
}
args["input"] = arg0
return args, nil
}
func (ec *executionContext) field_Mutation_removeMXID_args(ctx context.Context, rawArgs map[string]interface{}) (map[string]interface{}, error) { func (ec *executionContext) field_Mutation_removeMXID_args(ctx context.Context, rawArgs map[string]interface{}) (map[string]interface{}, error) {
var err error var err error
args := map[string]interface{}{} args := map[string]interface{}{}
@ -3029,7 +3034,7 @@ func (ec *executionContext) _Mutation_commentEntry(ctx context.Context, field gr
return ec.marshalNEntry2ᚖgithubᚗcomᚋUnkn0wnCatᚋmatrixᚑvelesᚋgraphᚋmodelᚐEntry(ctx, field.Selections, res) return ec.marshalNEntry2ᚖgithubᚗcomᚋUnkn0wnCatᚋmatrixᚑvelesᚋgraphᚋmodelᚐEntry(ctx, field.Selections, res)
} }
func (ec *executionContext) _Mutation_deleteEntry(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { func (ec *executionContext) _Mutation_addToLists(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {
defer func() { defer func() {
if r := recover(); r != nil { if r := recover(); r != nil {
ec.Error(ctx, ec.Recover(ctx, r)) ec.Error(ctx, ec.Recover(ctx, r))
@ -3046,7 +3051,7 @@ func (ec *executionContext) _Mutation_deleteEntry(ctx context.Context, field gra
ctx = graphql.WithFieldContext(ctx, fc) ctx = graphql.WithFieldContext(ctx, fc)
rawArgs := field.ArgumentMap(ec.Variables) rawArgs := field.ArgumentMap(ec.Variables)
args, err := ec.field_Mutation_deleteEntry_args(ctx, rawArgs) args, err := ec.field_Mutation_addToLists_args(ctx, rawArgs)
if err != nil { if err != nil {
ec.Error(ctx, err) ec.Error(ctx, err)
return graphql.Null return graphql.Null
@ -3055,7 +3060,7 @@ func (ec *executionContext) _Mutation_deleteEntry(ctx context.Context, field gra
resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) {
directive0 := func(rctx context.Context) (interface{}, error) { directive0 := func(rctx context.Context) (interface{}, error) {
ctx = rctx // use context from middleware stack in children ctx = rctx // use context from middleware stack in children
return ec.resolvers.Mutation().DeleteEntry(rctx, args["input"].(string)) return ec.resolvers.Mutation().AddToLists(rctx, args["input"].(model.AddToLists))
} }
directive1 := func(ctx context.Context) (interface{}, error) { directive1 := func(ctx context.Context) (interface{}, error) {
if ec.directives.LoggedIn == nil { if ec.directives.LoggedIn == nil {
@ -3063,28 +3068,18 @@ func (ec *executionContext) _Mutation_deleteEntry(ctx context.Context, field gra
} }
return ec.directives.LoggedIn(ctx, nil, directive0) return ec.directives.LoggedIn(ctx, nil, directive0)
} }
directive2 := func(ctx context.Context) (interface{}, error) {
role, err := ec.unmarshalNUserRole2githubᚗcomᚋUnkn0wnCatᚋmatrixᚑvelesᚋgraphᚋmodelᚐUserRole(ctx, "ADMIN")
if err != nil {
return nil, err
}
if ec.directives.HasRole == nil {
return nil, errors.New("directive hasRole is not implemented")
}
return ec.directives.HasRole(ctx, nil, directive1, role)
}
tmp, err := directive2(rctx) tmp, err := directive1(rctx)
if err != nil { if err != nil {
return nil, graphql.ErrorOnPath(ctx, err) return nil, graphql.ErrorOnPath(ctx, err)
} }
if tmp == nil { if tmp == nil {
return nil, nil return nil, nil
} }
if data, ok := tmp.(bool); ok { if data, ok := tmp.(*model.Entry); ok {
return data, nil return data, nil
} }
return nil, fmt.Errorf(`unexpected type %T from directive, should be bool`, tmp) return nil, fmt.Errorf(`unexpected type %T from directive, should be *github.com/Unkn0wnCat/matrix-veles/graph/model.Entry`, tmp)
}) })
if err != nil { if err != nil {
ec.Error(ctx, err) ec.Error(ctx, err)
@ -3096,9 +3091,71 @@ func (ec *executionContext) _Mutation_deleteEntry(ctx context.Context, field gra
} }
return graphql.Null return graphql.Null
} }
res := resTmp.(bool) res := resTmp.(*model.Entry)
fc.Result = res fc.Result = res
return ec.marshalNBoolean2bool(ctx, field.Selections, res) return ec.marshalNEntry2ᚖgithubᚗcomᚋUnkn0wnCatᚋmatrixᚑvelesᚋgraphᚋmodelᚐEntry(ctx, field.Selections, res)
}
func (ec *executionContext) _Mutation_removeFromLists(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {
defer func() {
if r := recover(); r != nil {
ec.Error(ctx, ec.Recover(ctx, r))
ret = graphql.Null
}
}()
fc := &graphql.FieldContext{
Object: "Mutation",
Field: field,
Args: nil,
IsMethod: true,
IsResolver: true,
}
ctx = graphql.WithFieldContext(ctx, fc)
rawArgs := field.ArgumentMap(ec.Variables)
args, err := ec.field_Mutation_removeFromLists_args(ctx, rawArgs)
if err != nil {
ec.Error(ctx, err)
return graphql.Null
}
fc.Args = args
resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) {
directive0 := func(rctx context.Context) (interface{}, error) {
ctx = rctx // use context from middleware stack in children
return ec.resolvers.Mutation().RemoveFromLists(rctx, args["input"].(model.RemoveFromLists))
}
directive1 := func(ctx context.Context) (interface{}, error) {
if ec.directives.LoggedIn == nil {
return nil, errors.New("directive loggedIn is not implemented")
}
return ec.directives.LoggedIn(ctx, nil, directive0)
}
tmp, err := directive1(rctx)
if err != nil {
return nil, graphql.ErrorOnPath(ctx, err)
}
if tmp == nil {
return nil, nil
}
if data, ok := tmp.(*model.Entry); ok {
return data, nil
}
return nil, fmt.Errorf(`unexpected type %T from directive, should be *github.com/Unkn0wnCat/matrix-veles/graph/model.Entry`, tmp)
})
if err != nil {
ec.Error(ctx, err)
return graphql.Null
}
if resTmp == nil {
if !graphql.HasFieldError(ctx, fc) {
ec.Errorf(ctx, "must not be null")
}
return graphql.Null
}
res := resTmp.(*model.Entry)
fc.Result = res
return ec.marshalNEntry2ᚖgithubᚗcomᚋUnkn0wnCatᚋmatrixᚑvelesᚋgraphᚋmodelᚐEntry(ctx, field.Selections, res)
} }
func (ec *executionContext) _Mutation_createList(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { func (ec *executionContext) _Mutation_createList(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {
@ -3225,74 +3282,6 @@ func (ec *executionContext) _Mutation_commentList(ctx context.Context, field gra
return ec.marshalNList2ᚖgithubᚗcomᚋUnkn0wnCatᚋmatrixᚑvelesᚋgraphᚋmodelᚐList(ctx, field.Selections, res) return ec.marshalNList2ᚖgithubᚗcomᚋUnkn0wnCatᚋmatrixᚑvelesᚋgraphᚋmodelᚐList(ctx, field.Selections, res)
} }
func (ec *executionContext) _Mutation_addToList(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {
defer func() {
if r := recover(); r != nil {
ec.Error(ctx, ec.Recover(ctx, r))
ret = graphql.Null
}
}()
fc := &graphql.FieldContext{
Object: "Mutation",
Field: field,
Args: nil,
IsMethod: true,
IsResolver: true,
}
ctx = graphql.WithFieldContext(ctx, fc)
rawArgs := field.ArgumentMap(ec.Variables)
args, err := ec.field_Mutation_addToList_args(ctx, rawArgs)
if err != nil {
ec.Error(ctx, err)
return graphql.Null
}
fc.Args = args
resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) {
directive0 := func(rctx context.Context) (interface{}, error) {
ctx = rctx // use context from middleware stack in children
return ec.resolvers.Mutation().AddToList(rctx, args["input"].(model.AddToList))
}
directive1 := func(ctx context.Context) (interface{}, error) {
if ec.directives.LoggedIn == nil {
return nil, errors.New("directive loggedIn is not implemented")
}
return ec.directives.LoggedIn(ctx, nil, directive0)
}
directive2 := func(ctx context.Context) (interface{}, error) {
if ec.directives.Maintainer == nil {
return nil, errors.New("directive maintainer is not implemented")
}
return ec.directives.Maintainer(ctx, nil, directive1)
}
tmp, err := directive2(rctx)
if err != nil {
return nil, graphql.ErrorOnPath(ctx, err)
}
if tmp == nil {
return nil, nil
}
if data, ok := tmp.(*model.List); ok {
return data, nil
}
return nil, fmt.Errorf(`unexpected type %T from directive, should be *github.com/Unkn0wnCat/matrix-veles/graph/model.List`, tmp)
})
if err != nil {
ec.Error(ctx, err)
return graphql.Null
}
if resTmp == nil {
if !graphql.HasFieldError(ctx, fc) {
ec.Errorf(ctx, "must not be null")
}
return graphql.Null
}
res := resTmp.(*model.List)
fc.Result = res
return ec.marshalNList2ᚖgithubᚗcomᚋUnkn0wnCatᚋmatrixᚑvelesᚋgraphᚋmodelᚐList(ctx, field.Selections, res)
}
func (ec *executionContext) _Mutation_deleteList(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { func (ec *executionContext) _Mutation_deleteList(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {
defer func() { defer func() {
if r := recover(); r != nil { if r := recover(); r != nil {
@ -4150,28 +4139,8 @@ func (ec *executionContext) _User_pendingMatrixLinks(ctx context.Context, field
ctx = graphql.WithFieldContext(ctx, fc) ctx = graphql.WithFieldContext(ctx, fc)
resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) {
directive0 := func(rctx context.Context) (interface{}, error) {
ctx = rctx // use context from middleware stack in children ctx = rctx // use context from middleware stack in children
return obj.PendingMatrixLinks, nil return obj.PendingMatrixLinks, nil
}
directive1 := func(ctx context.Context) (interface{}, error) {
if ec.directives.Owner == nil {
return nil, errors.New("directive owner is not implemented")
}
return ec.directives.Owner(ctx, obj, directive0)
}
tmp, err := directive1(rctx)
if err != nil {
return nil, graphql.ErrorOnPath(ctx, err)
}
if tmp == nil {
return nil, nil
}
if data, ok := tmp.([]*string); ok {
return data, nil
}
return nil, fmt.Errorf(`unexpected type %T from directive, should be []*string`, tmp)
}) })
if err != nil { if err != nil {
ec.Error(ctx, err) ec.Error(ctx, err)
@ -5470,8 +5439,8 @@ func (ec *executionContext) unmarshalInputAddMXID(ctx context.Context, obj inter
return it, nil return it, nil
} }
func (ec *executionContext) unmarshalInputAddToList(ctx context.Context, obj interface{}) (model.AddToList, error) { func (ec *executionContext) unmarshalInputAddToLists(ctx context.Context, obj interface{}) (model.AddToLists, error) {
var it model.AddToList var it model.AddToLists
asMap := map[string]interface{}{} asMap := map[string]interface{}{}
for k, v := range obj.(map[string]interface{}) { for k, v := range obj.(map[string]interface{}) {
asMap[k] = v asMap[k] = v
@ -5479,19 +5448,19 @@ func (ec *executionContext) unmarshalInputAddToList(ctx context.Context, obj int
for k, v := range asMap { for k, v := range asMap {
switch k { switch k {
case "list": case "lists":
var err error var err error
ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("list")) ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("lists"))
it.List, err = ec.unmarshalNID2string(ctx, v) it.Lists, err = ec.unmarshalNID2string(ctx, v)
if err != nil { if err != nil {
return it, err return it, err
} }
case "entries": case "entry":
var err error var err error
ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("entries")) ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("entry"))
it.Entries, err = ec.unmarshalNID2string(ctx, v) it.Entry, err = ec.unmarshalNID2string(ctx, v)
if err != nil { if err != nil {
return it, err return it, err
} }
@ -6079,6 +6048,37 @@ func (ec *executionContext) unmarshalInputRegister(ctx context.Context, obj inte
return it, nil return it, nil
} }
func (ec *executionContext) unmarshalInputRemoveFromLists(ctx context.Context, obj interface{}) (model.RemoveFromLists, error) {
var it model.RemoveFromLists
asMap := map[string]interface{}{}
for k, v := range obj.(map[string]interface{}) {
asMap[k] = v
}
for k, v := range asMap {
switch k {
case "lists":
var err error
ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("lists"))
it.Lists, err = ec.unmarshalNID2ᚕstringᚄ(ctx, v)
if err != nil {
return it, err
}
case "entry":
var err error
ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("entry"))
it.Entry, err = ec.unmarshalNID2string(ctx, v)
if err != nil {
return it, err
}
}
}
return it, nil
}
func (ec *executionContext) unmarshalInputRemoveMXID(ctx context.Context, obj interface{}) (model.RemoveMxid, error) { func (ec *executionContext) unmarshalInputRemoveMXID(ctx context.Context, obj interface{}) (model.RemoveMxid, error) {
var it model.RemoveMxid var it model.RemoveMxid
asMap := map[string]interface{}{} asMap := map[string]interface{}{}
@ -6817,8 +6817,13 @@ func (ec *executionContext) _Mutation(ctx context.Context, sel ast.SelectionSet)
if out.Values[i] == graphql.Null { if out.Values[i] == graphql.Null {
invalids++ invalids++
} }
case "deleteEntry": case "addToLists":
out.Values[i] = ec._Mutation_deleteEntry(ctx, field) out.Values[i] = ec._Mutation_addToLists(ctx, field)
if out.Values[i] == graphql.Null {
invalids++
}
case "removeFromLists":
out.Values[i] = ec._Mutation_removeFromLists(ctx, field)
if out.Values[i] == graphql.Null { if out.Values[i] == graphql.Null {
invalids++ invalids++
} }
@ -6832,11 +6837,6 @@ func (ec *executionContext) _Mutation(ctx context.Context, sel ast.SelectionSet)
if out.Values[i] == graphql.Null { if out.Values[i] == graphql.Null {
invalids++ invalids++
} }
case "addToList":
out.Values[i] = ec._Mutation_addToList(ctx, field)
if out.Values[i] == graphql.Null {
invalids++
}
case "deleteList": case "deleteList":
out.Values[i] = ec._Mutation_deleteList(ctx, field) out.Values[i] = ec._Mutation_deleteList(ctx, field)
if out.Values[i] == graphql.Null { if out.Values[i] == graphql.Null {
@ -7380,8 +7380,8 @@ func (ec *executionContext) unmarshalNAddMXID2githubᚗcomᚋUnkn0wnCatᚋmatrix
return res, graphql.ErrorOnPath(ctx, err) return res, graphql.ErrorOnPath(ctx, err)
} }
func (ec *executionContext) unmarshalNAddToList2githubᚗcomᚋUnkn0wnCatᚋmatrixᚑvelesᚋgraphᚋmodelᚐAddToList(ctx context.Context, v interface{}) (model.AddToList, error) { func (ec *executionContext) unmarshalNAddToLists2githubᚗcomᚋUnkn0wnCatᚋmatrixᚑvelesᚋgraphᚋmodelᚐAddToLists(ctx context.Context, v interface{}) (model.AddToLists, error) {
res, err := ec.unmarshalInputAddToList(ctx, v) res, err := ec.unmarshalInputAddToLists(ctx, v)
return res, graphql.ErrorOnPath(ctx, err) return res, graphql.ErrorOnPath(ctx, err)
} }
@ -7719,6 +7719,11 @@ func (ec *executionContext) unmarshalNRegister2githubᚗcomᚋUnkn0wnCatᚋmatri
return res, graphql.ErrorOnPath(ctx, err) return res, graphql.ErrorOnPath(ctx, err)
} }
func (ec *executionContext) unmarshalNRemoveFromLists2githubᚗcomᚋUnkn0wnCatᚋmatrixᚑvelesᚋgraphᚋmodelᚐRemoveFromLists(ctx context.Context, v interface{}) (model.RemoveFromLists, error) {
res, err := ec.unmarshalInputRemoveFromLists(ctx, v)
return res, graphql.ErrorOnPath(ctx, err)
}
func (ec *executionContext) unmarshalNRemoveMXID2githubᚗcomᚋUnkn0wnCatᚋmatrixᚑvelesᚋgraphᚋmodelᚐRemoveMxid(ctx context.Context, v interface{}) (model.RemoveMxid, error) { func (ec *executionContext) unmarshalNRemoveMXID2githubᚗcomᚋUnkn0wnCatᚋmatrixᚑvelesᚋgraphᚋmodelᚐRemoveMxid(ctx context.Context, v interface{}) (model.RemoveMxid, error) {
res, err := ec.unmarshalInputRemoveMXID(ctx, v) res, err := ec.unmarshalInputRemoveMXID(ctx, v)
return res, graphql.ErrorOnPath(ctx, err) return res, graphql.ErrorOnPath(ctx, err)

View file

@ -12,6 +12,30 @@ import (
"time" "time"
) )
func PerformListMaintainerCheck(listIdHex string, userIdHex string) error {
id, err := primitive.ObjectIDFromHex(listIdHex)
if err != nil {
return err
}
list, err := db.GetListByID(id)
if err != nil {
return err
}
if list.Creator.Hex() == userIdHex {
return nil
}
for _, maintainerId := range list.Maintainers {
if maintainerId.Hex() == userIdHex {
return nil
}
}
return errors.New("unauthorized")
}
func GetUserFromContext(ctx context.Context) (*model2.DBUser, error) { func GetUserFromContext(ctx context.Context) (*model2.DBUser, error) {
userID, err := GetUserIDFromContext(ctx) userID, err := GetUserIDFromContext(ctx)
if err != nil { if err != nil {

View file

@ -11,6 +11,7 @@ type List struct {
Tags []string `json:"tags"` Tags []string `json:"tags"`
RawComments []*model.DBComment RawComments []*model.DBComment
MaintainerIDs []*primitive.ObjectID MaintainerIDs []*primitive.ObjectID
CreatorID primitive.ObjectID
} }
func MakeList(dbList *model.DBHashList) *List { func MakeList(dbList *model.DBHashList) *List {
@ -20,5 +21,6 @@ func MakeList(dbList *model.DBHashList) *List {
Tags: dbList.Tags, Tags: dbList.Tags,
RawComments: dbList.Comments, RawComments: dbList.Comments,
MaintainerIDs: dbList.Maintainers, MaintainerIDs: dbList.Maintainers,
CreatorID: dbList.Creator,
} }
} }

View file

@ -13,9 +13,9 @@ type AddMxid struct {
Mxid string `json:"mxid"` Mxid string `json:"mxid"`
} }
type AddToList struct { type AddToLists struct {
List string `json:"list"` Lists []string `json:"lists"`
Entries []string `json:"entries"` Entry string `json:"entry"`
} }
type CommentConnection struct { type CommentConnection struct {
@ -143,6 +143,11 @@ type Register struct {
MxID string `json:"mxID"` MxID string `json:"mxID"`
} }
type RemoveFromLists struct {
Lists []string `json:"lists"`
Entry string `json:"entry"`
}
type RemoveMxid struct { type RemoveMxid struct {
Mxid string `json:"mxid"` Mxid string `json:"mxid"`
} }

View file

@ -246,9 +246,14 @@ input CommentList {
comment: String! comment: String!
} }
input AddToList { input AddToLists {
list: ID! lists: [ID!]!
entries: [ID!]! entry: ID!
}
input RemoveFromLists {
lists: [ID!]!
entry: ID!
} }
input AddMXID { input AddMXID {
@ -267,11 +272,11 @@ type Mutation {
createEntry(input: CreateEntry!): Entry! @loggedIn createEntry(input: CreateEntry!): Entry! @loggedIn
commentEntry(input: CommentEntry!): Entry! @loggedIn commentEntry(input: CommentEntry!): Entry! @loggedIn
deleteEntry(input: ID!): Boolean! @loggedIn @hasRole(role: ADMIN) addToLists(input: AddToLists!): Entry! @loggedIn
removeFromLists(input: RemoveFromLists!): Entry! @loggedIn
createList(input: CreateList!): List! @loggedIn createList(input: CreateList!): List! @loggedIn
commentList(input: CommentList!): List! @loggedIn commentList(input: CommentList!): List! @loggedIn
addToList(input: AddToList!): List! @loggedIn @maintainer
deleteList(input: ID!): Boolean! @loggedIn @owner deleteList(input: ID!): Boolean! @loggedIn @owner
} }

View file

@ -8,6 +8,7 @@ import (
"errors" "errors"
"fmt" "fmt"
"math/big" "math/big"
"strings"
"time" "time"
"github.com/Unkn0wnCat/matrix-veles/graph/generated" "github.com/Unkn0wnCat/matrix-veles/graph/generated"
@ -130,7 +131,12 @@ func (r *entryResolver) Comments(ctx context.Context, obj *model.Entry, first *i
} }
func (r *listResolver) Creator(ctx context.Context, obj *model.List) (*model.User, error) { func (r *listResolver) Creator(ctx context.Context, obj *model.List) (*model.User, error) {
panic(fmt.Errorf("not implemented")) user, err := db.GetUserByID(obj.CreatorID)
if err != nil {
return nil, errors.New("database error")
}
return model.MakeUser(user), nil
} }
func (r *listResolver) Comments(ctx context.Context, obj *model.List, first *int, after *string) (*model.CommentConnection, error) { func (r *listResolver) Comments(ctx context.Context, obj *model.List, first *int, after *string) (*model.CommentConnection, error) {
@ -330,39 +336,342 @@ func (r *mutationResolver) Login(ctx context.Context, input model.Login) (string
} }
func (r *mutationResolver) Register(ctx context.Context, input model.Register) (string, error) { func (r *mutationResolver) Register(ctx context.Context, input model.Register) (string, error) {
panic(fmt.Errorf("not implemented")) _, err := db.GetUserByUsername(input.Username)
if !errors.Is(err, mongo.ErrNoDocuments) {
return "", errors.New("username taken")
}
user := model2.DBUser{
ID: primitive.NewObjectID(),
Username: input.Username,
PendingMatrixLinks: []*string{&input.MxID},
Password: &input.Password,
}
err = user.HashPassword()
if err != nil {
return "", errors.New("server error")
}
err = db.SaveUser(&user)
if err != nil {
return "", errors.New("database error")
}
jwtSigningKey := []byte(viper.GetString("bot.web.secret"))
claims := model2.JwtClaims{
Username: user.Username,
RegisteredClaims: jwt.RegisteredClaims{
ExpiresAt: jwt.NewNumericDate(time.Now().Add(time.Hour * 24 * 365 * 100)),
IssuedAt: jwt.NewNumericDate(time.Now()),
NotBefore: jwt.NewNumericDate(time.Now()),
Issuer: "veles-api",
Subject: user.ID.Hex(),
},
}
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
ss, err := token.SignedString(jwtSigningKey)
if err != nil {
return "", errors.New("unable to create token")
}
return ss, nil
} }
func (r *mutationResolver) AddMxid(ctx context.Context, input model.AddMxid) (*model.User, error) { func (r *mutationResolver) AddMxid(ctx context.Context, input model.AddMxid) (*model.User, error) {
panic(fmt.Errorf("not implemented")) user, err := GetUserFromContext(ctx)
if err != nil {
return nil, err
}
for _, mxid := range append(user.MatrixLinks, user.PendingMatrixLinks...) {
if strings.EqualFold(*mxid, input.Mxid) {
return model.MakeUser(user), nil
}
}
user.PendingMatrixLinks = append(user.PendingMatrixLinks, &input.Mxid)
err = db.SaveUser(user)
if err != nil {
return nil, errors.New("database error")
}
return model.MakeUser(user), nil
} }
func (r *mutationResolver) RemoveMxid(ctx context.Context, input model.RemoveMxid) (*model.User, error) { func (r *mutationResolver) RemoveMxid(ctx context.Context, input model.RemoveMxid) (*model.User, error) {
panic(fmt.Errorf("not implemented")) user, err := GetUserFromContext(ctx)
if err != nil {
return nil, err
}
for i, mxid := range user.MatrixLinks {
if strings.EqualFold(*mxid, input.Mxid) {
user.MatrixLinks = append(user.MatrixLinks[:i], user.MatrixLinks[i+1:]...)
}
}
for i, mxid := range user.PendingMatrixLinks {
if strings.EqualFold(*mxid, input.Mxid) {
user.PendingMatrixLinks = append(user.PendingMatrixLinks[:i], user.PendingMatrixLinks[i+1:]...)
}
}
err = db.SaveUser(user)
if err != nil {
return nil, errors.New("database error")
}
return model.MakeUser(user), nil
} }
func (r *mutationResolver) CreateEntry(ctx context.Context, input model.CreateEntry) (*model.Entry, error) { func (r *mutationResolver) CreateEntry(ctx context.Context, input model.CreateEntry) (*model.Entry, error) {
panic(fmt.Errorf("not implemented")) user, err := GetUserFromContext(ctx)
if err != nil {
return nil, err
}
entry, err := db.GetEntryByHash(input.HashValue)
if err != nil && !errors.Is(err, mongo.ErrNoDocuments) {
return nil, errors.New("database error")
}
if entry == nil {
entry = &model2.DBEntry{
ID: primitive.NewObjectID(),
Tags: input.Tags,
HashValue: input.HashValue,
Timestamp: time.Now(),
AddedBy: &user.ID,
Comments: nil,
}
}
if len(input.PartOf) > 0 {
for _, partOfId := range input.PartOf {
err = PerformListMaintainerCheck(partOfId, user.ID.Hex())
if err != nil {
return nil, errors.New("error adding to lists")
}
partOf, _ := primitive.ObjectIDFromHex(partOfId) // This can't fail, it worked in PerformListMaintainerCheck
entry.AddTo(&partOf)
}
}
if input.Comment != nil {
entry.Comments = append(entry.Comments, &model2.DBComment{
Timestamp: time.Now(),
CommentedBy: &user.ID,
Content: *input.Comment,
})
}
err = db.SaveEntry(entry)
if err != nil {
return nil, errors.New("database error")
}
return model.MakeEntry(entry), nil
} }
func (r *mutationResolver) CommentEntry(ctx context.Context, input model.CommentEntry) (*model.Entry, error) { func (r *mutationResolver) CommentEntry(ctx context.Context, input model.CommentEntry) (*model.Entry, error) {
panic(fmt.Errorf("not implemented")) user, err := GetUserFromContext(ctx)
if err != nil {
return nil, err
} }
func (r *mutationResolver) DeleteEntry(ctx context.Context, input string) (bool, error) { id, err := primitive.ObjectIDFromHex(input.Entry)
panic(fmt.Errorf("not implemented")) if err != nil {
return nil, err
}
entry, err := db.GetEntryByID(id)
if err != nil {
if errors.Is(err, mongo.ErrNoDocuments) {
return nil, errors.New("not found")
}
return nil, errors.New("database error")
}
entry.Comments = append(entry.Comments, &model2.DBComment{
Timestamp: time.Now(),
CommentedBy: &user.ID,
Content: input.Comment,
})
err = db.SaveEntry(entry)
if err != nil {
return nil, errors.New("database error")
}
return model.MakeEntry(entry), nil
}
func (r *mutationResolver) AddToLists(ctx context.Context, input model.AddToLists) (*model.Entry, error) {
user, err := GetUserFromContext(ctx)
if err != nil {
return nil, err
}
id, err := primitive.ObjectIDFromHex(input.Entry)
if err != nil {
return nil, err
}
entry, err := db.GetEntryByID(id)
if err != nil {
if errors.Is(err, mongo.ErrNoDocuments) {
return nil, errors.New("not found")
}
return nil, errors.New("database error")
}
if len(input.Lists) > 0 {
for _, partOfId := range input.Lists {
err = PerformListMaintainerCheck(partOfId, user.ID.Hex())
if err != nil {
return nil, errors.New("error adding to lists")
}
partOf, _ := primitive.ObjectIDFromHex(partOfId) // This can't fail, it worked in PerformListMaintainerCheck
entry.AddTo(&partOf)
}
}
err = db.SaveEntry(entry)
if err != nil {
return nil, errors.New("database error")
}
return model.MakeEntry(entry), nil
}
func (r *mutationResolver) RemoveFromLists(ctx context.Context, input model.RemoveFromLists) (*model.Entry, error) {
user, err := GetUserFromContext(ctx)
if err != nil {
return nil, err
}
id, err := primitive.ObjectIDFromHex(input.Entry)
if err != nil {
return nil, err
}
entry, err := db.GetEntryByID(id)
if err != nil {
if errors.Is(err, mongo.ErrNoDocuments) {
return nil, errors.New("not found")
}
return nil, errors.New("database error")
}
if len(input.Lists) > 0 {
for _, partOfId := range input.Lists {
err = PerformListMaintainerCheck(partOfId, user.ID.Hex())
if err != nil {
return nil, errors.New("error adding to lists")
}
partOf, _ := primitive.ObjectIDFromHex(partOfId) // This can't fail, it worked in PerformListMaintainerCheck
entry.RemoveFrom(&partOf)
}
}
err = db.SaveEntry(entry)
if err != nil {
return nil, errors.New("database error")
}
return model.MakeEntry(entry), nil
} }
func (r *mutationResolver) CreateList(ctx context.Context, input model.CreateList) (*model.List, error) { func (r *mutationResolver) CreateList(ctx context.Context, input model.CreateList) (*model.List, error) {
panic(fmt.Errorf("not implemented")) user, err := GetUserFromContext(ctx)
if err != nil {
return nil, err
}
_, err = db.GetListByName(input.Name)
if !errors.Is(err, mongo.ErrNoDocuments) {
return nil, errors.New("name taken")
}
list := model2.DBHashList{
ID: primitive.NewObjectID(),
Name: input.Name,
Tags: input.Tags,
Creator: user.ID,
}
for _, maintainer := range input.Maintainers {
id, err := primitive.ObjectIDFromHex(maintainer)
if err != nil {
return nil, err
}
maintainerUser, err := db.GetUserByID(id)
if err != nil {
if errors.Is(err, mongo.ErrNoDocuments) {
return nil, errors.New("maintainer not found")
}
return nil, errors.New("database error")
}
list.Maintainers = append(list.Maintainers, &maintainerUser.ID)
}
if input.Comment != nil {
list.Comments = append(list.Comments, &model2.DBComment{
Timestamp: time.Now(),
CommentedBy: &user.ID,
Content: *input.Comment,
})
}
err = db.SaveList(&list)
if err != nil {
return nil, errors.New("database error")
}
return model.MakeList(&list), nil
} }
func (r *mutationResolver) CommentList(ctx context.Context, input model.CommentList) (*model.List, error) { func (r *mutationResolver) CommentList(ctx context.Context, input model.CommentList) (*model.List, error) {
panic(fmt.Errorf("not implemented")) user, err := GetUserFromContext(ctx)
if err != nil {
return nil, err
} }
func (r *mutationResolver) AddToList(ctx context.Context, input model.AddToList) (*model.List, error) { id, err := primitive.ObjectIDFromHex(input.List)
panic(fmt.Errorf("not implemented")) if err != nil {
return nil, err
}
list, err := db.GetListByID(id)
if err != nil {
if errors.Is(err, mongo.ErrNoDocuments) {
return nil, errors.New("not found")
}
return nil, errors.New("database error")
}
list.Comments = append(list.Comments, &model2.DBComment{
Timestamp: time.Now(),
CommentedBy: &user.ID,
Content: input.Comment,
})
err = db.SaveList(list)
if err != nil {
return nil, errors.New("database error")
}
return model.MakeList(list), nil
} }
func (r *mutationResolver) DeleteList(ctx context.Context, input string) (bool, error) { func (r *mutationResolver) DeleteList(ctx context.Context, input string) (bool, error) {

View file

@ -10,6 +10,7 @@ import (
"go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options" "go.mongodb.org/mongo-driver/mongo/options"
"log" "log"
"regexp"
"time" "time"
) )
@ -235,7 +236,12 @@ func GetUserByID(id primitive.ObjectID) (*model.DBUser, error) {
func GetUserByUsername(username string) (*model.DBUser, error) { func GetUserByUsername(username string) (*model.DBUser, error) {
db := DbClient.Database(viper.GetString("bot.mongo.database")) db := DbClient.Database(viper.GetString("bot.mongo.database"))
res := db.Collection(viper.GetString("bot.mongo.collection.users")).FindOne(context.TODO(), bson.D{{"username", username}}) regexPattern := "^" + regexp.QuoteMeta(username) + "$"
res := db.Collection(viper.GetString("bot.mongo.collection.users")).FindOne(context.TODO(), bson.D{{"username", primitive.Regex{
Pattern: regexPattern,
Options: "i",
}}})
if res.Err() != nil { if res.Err() != nil {
return nil, res.Err() return nil, res.Err()
} }

View file

@ -15,3 +15,24 @@ type DBEntry struct {
AddedBy *primitive.ObjectID `bson:"added_by" json:"added_by"` // AddedBy is a reference to the user who added this AddedBy *primitive.ObjectID `bson:"added_by" json:"added_by"` // AddedBy is a reference to the user who added this
Comments []*DBComment `bson:"comments" json:"comments"` // Comments regarding this entry Comments []*DBComment `bson:"comments" json:"comments"` // Comments regarding this entry
} }
func (entry *DBEntry) AddTo(id *primitive.ObjectID) {
for _, addedTo := range entry.PartOf {
if addedTo.Hex() == id.Hex() {
return
}
}
entry.PartOf = append(entry.PartOf, id)
}
func (entry *DBEntry) RemoveFrom(id *primitive.ObjectID) {
for i, addedTo := range entry.PartOf {
if addedTo.Hex() == id.Hex() {
entry.PartOf = append(entry.PartOf[:i], entry.PartOf[i+1:]...)
return
}
}
return
}

View file

@ -7,5 +7,6 @@ type DBHashList struct {
Name string `bson:"name" json:"name"` Name string `bson:"name" json:"name"`
Tags []string `bson:"tags" json:"tags"` // Tags of this list for discovery, and sorting Tags []string `bson:"tags" json:"tags"` // Tags of this list for discovery, and sorting
Comments []*DBComment `bson:"comments" json:"comments"` // Comments regarding this list Comments []*DBComment `bson:"comments" json:"comments"` // Comments regarding this list
Creator primitive.ObjectID `bson:"creator" json:"creator"` // Creator of the list
Maintainers []*primitive.ObjectID `bson:"maintainers" json:"maintainers"` // Maintainers contains references to the users who may edit this list Maintainers []*primitive.ObjectID `bson:"maintainers" json:"maintainers"` // Maintainers contains references to the users who may edit this list
} }