graphq fs interface

This commit is contained in:
royalcat 2025-04-04 02:29:10 +04:00
parent 52999672f8
commit 8df0984b86
8 changed files with 111 additions and 92 deletions

View file

@ -45,3 +45,4 @@ models:
autobind: autobind:
- "git.kmsign.ru/royalcat/tstor/server/src/delivery/filter" - "git.kmsign.ru/royalcat/tstor/server/src/delivery/filter"
- "git.kmsign.ru/royalcat/tstor/server/src/delivery/graphql/fs"

View file

@ -1,8 +1,9 @@
package model package fs
import ( import (
"context" "context"
"git.kmsign.ru/royalcat/tstor/server/src/delivery/graphql/model"
"git.kmsign.ru/royalcat/tstor/server/src/vfs" "git.kmsign.ru/royalcat/tstor/server/src/vfs"
) )
@ -11,7 +12,7 @@ type FsElem interface {
IsDir() bool IsDir() bool
} }
func FillFsEntry(ctx context.Context, e FsElem, fs vfs.Filesystem, path string) (FsEntry, error) { func FillFsEntry(ctx context.Context, e FsElem, fs vfs.Filesystem, path string) (model.FsEntry, error) {
switch e.(type) { switch e.(type) {
case *vfs.ResolverFS: case *vfs.ResolverFS:
e := e.(*vfs.ResolverFS) e := e.(*vfs.ResolverFS)
@ -53,12 +54,12 @@ func FillFsEntry(ctx context.Context, e FsElem, fs vfs.Filesystem, path string)
} }
} }
func ReadEntries(ctx context.Context, fs vfs.Filesystem, path string) ([]FsEntry, error) { func ReadEntries(ctx context.Context, fs vfs.Filesystem, path string) ([]model.FsEntry, error) {
entries, err := fs.ReadDir(ctx, path) entries, err := fs.ReadDir(ctx, path)
if err != nil { if err != nil {
return nil, err return nil, err
} }
out := []FsEntry{} out := []model.FsEntry{}
for _, e := range entries { for _, e := range entries {
entry, err := FillFsEntry(ctx, e, fs, ".") entry, err := FillFsEntry(ctx, e, fs, ".")
if err != nil { if err != nil {
@ -69,12 +70,12 @@ func ReadEntries(ctx context.Context, fs vfs.Filesystem, path string) ([]FsEntry
return out, nil return out, nil
} }
func (obj *ResolverFs) ResolverEntries(ctx context.Context) ([]FsEntry, error) { func (obj *ResolverFs) ResolverEntries(ctx context.Context) ([]model.FsEntry, error) {
entries, err := obj.FS.ReadDir(ctx, ".") entries, err := obj.FS.ReadDir(ctx, ".")
if err != nil { if err != nil {
return nil, err return nil, err
} }
out := []FsEntry{} out := []model.FsEntry{}
for _, e := range entries { for _, e := range entries {
entry, err := FillFsEntry(ctx, e, obj.FS, ".") entry, err := FillFsEntry(ctx, e, obj.FS, ".")
if err != nil { if err != nil {
@ -85,12 +86,12 @@ func (obj *ResolverFs) ResolverEntries(ctx context.Context) ([]FsEntry, error) {
return out, nil return out, nil
} }
func (obj *SimpleDir) SimpleDirEntries(ctx context.Context) ([]FsEntry, error) { func (obj *SimpleDir) SimpleDirEntries(ctx context.Context) ([]model.FsEntry, error) {
entries, err := obj.FS.ReadDir(ctx, obj.Path) entries, err := obj.FS.ReadDir(ctx, obj.Path)
if err != nil { if err != nil {
return nil, err return nil, err
} }
out := []FsEntry{} out := []model.FsEntry{}
for _, e := range entries { for _, e := range entries {
entry, err := FillFsEntry(ctx, e, obj.FS, obj.Path) entry, err := FillFsEntry(ctx, e, obj.FS, obj.Path)
if err != nil { if err != nil {

View file

@ -0,0 +1,42 @@
package fs
import (
"git.kmsign.ru/royalcat/tstor/server/src/delivery/graphql/model"
"git.kmsign.ru/royalcat/tstor/server/src/vfs"
)
var _ model.FsEntry = (*SimpleDir)(nil)
var _ model.Dir = (*SimpleDir)(nil)
type SimpleDir struct {
Name string `json:"name"`
Entries []model.FsEntry `json:"entries"`
FS vfs.Filesystem `json:"-"`
Path string `json:"-"`
}
func (SimpleDir) IsDir() {}
func (this SimpleDir) GetName() string { return this.Name }
func (this SimpleDir) GetEntries() []model.FsEntry {
if this.Entries == nil {
return nil
}
interfaceSlice := make([]model.FsEntry, 0, len(this.Entries))
for _, concrete := range this.Entries {
interfaceSlice = append(interfaceSlice, concrete)
}
return interfaceSlice
}
func (SimpleDir) IsFsEntry() {}
type SimpleFile struct {
Name string `json:"name"`
Size int64 `json:"size"`
}
func (SimpleFile) IsFile() {}
func (this SimpleFile) GetName() string { return this.Name }
func (this SimpleFile) GetSize() int64 { return this.Size }
func (SimpleFile) IsFsEntry() {}

View file

@ -0,0 +1,30 @@
package fs
import (
"git.kmsign.ru/royalcat/tstor/server/src/delivery/graphql/model"
"git.kmsign.ru/royalcat/tstor/server/src/vfs"
)
var _ model.FsEntry = (*ResolverFs)(nil)
var _ model.Dir = (*ResolverFs)(nil)
type ResolverFs struct {
Name string `json:"name"`
Entries []model.FsEntry `json:"entries"`
FS *vfs.ResolverFS `json:"-"`
}
func (ResolverFs) IsDir() {}
func (this ResolverFs) GetName() string { return this.Name }
func (this ResolverFs) GetEntries() []model.FsEntry {
if this.Entries == nil {
return nil
}
interfaceSlice := make([]model.FsEntry, 0, len(this.Entries))
for _, concrete := range this.Entries {
interfaceSlice = append(interfaceSlice, concrete)
}
return interfaceSlice
}
func (ResolverFs) IsFsEntry() {}

View file

@ -14,6 +14,7 @@ import (
"time" "time"
"git.kmsign.ru/royalcat/tstor/server/src/delivery/filter" "git.kmsign.ru/royalcat/tstor/server/src/delivery/filter"
"git.kmsign.ru/royalcat/tstor/server/src/delivery/graphql/fs"
"git.kmsign.ru/royalcat/tstor/server/src/delivery/graphql/model" "git.kmsign.ru/royalcat/tstor/server/src/delivery/graphql/model"
"github.com/99designs/gqlgen/graphql" "github.com/99designs/gqlgen/graphql"
"github.com/99designs/gqlgen/graphql/introspection" "github.com/99designs/gqlgen/graphql/introspection"
@ -107,10 +108,10 @@ type QueryResolver interface {
FsEntry(ctx context.Context, path string) (model.FsEntry, error) FsEntry(ctx context.Context, path string) (model.FsEntry, error)
} }
type ResolverFSResolver interface { type ResolverFSResolver interface {
Entries(ctx context.Context, obj *model.ResolverFs) ([]model.FsEntry, error) Entries(ctx context.Context, obj *fs.ResolverFs) ([]model.FsEntry, error)
} }
type SimpleDirResolver interface { type SimpleDirResolver interface {
Entries(ctx context.Context, obj *model.SimpleDir) ([]model.FsEntry, error) Entries(ctx context.Context, obj *fs.SimpleDir) ([]model.FsEntry, error)
} }
type SubscriptionResolver interface { type SubscriptionResolver interface {
TaskProgress(ctx context.Context, taskID string) (<-chan model.Progress, error) TaskProgress(ctx context.Context, taskID string) (<-chan model.Progress, error)
@ -1178,7 +1179,7 @@ func (ec *executionContext) fieldContext_Query___schema(_ context.Context, field
return fc, nil return fc, nil
} }
func (ec *executionContext) _ResolverFS_name(ctx context.Context, field graphql.CollectedField, obj *model.ResolverFs) (ret graphql.Marshaler) { func (ec *executionContext) _ResolverFS_name(ctx context.Context, field graphql.CollectedField, obj *fs.ResolverFs) (ret graphql.Marshaler) {
fc, err := ec.fieldContext_ResolverFS_name(ctx, field) fc, err := ec.fieldContext_ResolverFS_name(ctx, field)
if err != nil { if err != nil {
return graphql.Null return graphql.Null
@ -1222,7 +1223,7 @@ func (ec *executionContext) fieldContext_ResolverFS_name(_ context.Context, fiel
return fc, nil return fc, nil
} }
func (ec *executionContext) _ResolverFS_entries(ctx context.Context, field graphql.CollectedField, obj *model.ResolverFs) (ret graphql.Marshaler) { func (ec *executionContext) _ResolverFS_entries(ctx context.Context, field graphql.CollectedField, obj *fs.ResolverFs) (ret graphql.Marshaler) {
fc, err := ec.fieldContext_ResolverFS_entries(ctx, field) fc, err := ec.fieldContext_ResolverFS_entries(ctx, field)
if err != nil { if err != nil {
return graphql.Null return graphql.Null
@ -1364,7 +1365,7 @@ func (ec *executionContext) fieldContext_Schema_mutation(_ context.Context, fiel
return fc, nil return fc, nil
} }
func (ec *executionContext) _SimpleDir_name(ctx context.Context, field graphql.CollectedField, obj *model.SimpleDir) (ret graphql.Marshaler) { func (ec *executionContext) _SimpleDir_name(ctx context.Context, field graphql.CollectedField, obj *fs.SimpleDir) (ret graphql.Marshaler) {
fc, err := ec.fieldContext_SimpleDir_name(ctx, field) fc, err := ec.fieldContext_SimpleDir_name(ctx, field)
if err != nil { if err != nil {
return graphql.Null return graphql.Null
@ -1408,7 +1409,7 @@ func (ec *executionContext) fieldContext_SimpleDir_name(_ context.Context, field
return fc, nil return fc, nil
} }
func (ec *executionContext) _SimpleDir_entries(ctx context.Context, field graphql.CollectedField, obj *model.SimpleDir) (ret graphql.Marshaler) { func (ec *executionContext) _SimpleDir_entries(ctx context.Context, field graphql.CollectedField, obj *fs.SimpleDir) (ret graphql.Marshaler) {
fc, err := ec.fieldContext_SimpleDir_entries(ctx, field) fc, err := ec.fieldContext_SimpleDir_entries(ctx, field)
if err != nil { if err != nil {
return graphql.Null return graphql.Null
@ -1474,7 +1475,7 @@ func (ec *executionContext) fieldContext_SimpleDir_entries(_ context.Context, fi
return fc, nil return fc, nil
} }
func (ec *executionContext) _SimpleFile_name(ctx context.Context, field graphql.CollectedField, obj *model.SimpleFile) (ret graphql.Marshaler) { func (ec *executionContext) _SimpleFile_name(ctx context.Context, field graphql.CollectedField, obj *fs.SimpleFile) (ret graphql.Marshaler) {
fc, err := ec.fieldContext_SimpleFile_name(ctx, field) fc, err := ec.fieldContext_SimpleFile_name(ctx, field)
if err != nil { if err != nil {
return graphql.Null return graphql.Null
@ -1518,7 +1519,7 @@ func (ec *executionContext) fieldContext_SimpleFile_name(_ context.Context, fiel
return fc, nil return fc, nil
} }
func (ec *executionContext) _SimpleFile_size(ctx context.Context, field graphql.CollectedField, obj *model.SimpleFile) (ret graphql.Marshaler) { func (ec *executionContext) _SimpleFile_size(ctx context.Context, field graphql.CollectedField, obj *fs.SimpleFile) (ret graphql.Marshaler) {
fc, err := ec.fieldContext_SimpleFile_size(ctx, field) fc, err := ec.fieldContext_SimpleFile_size(ctx, field)
if err != nil { if err != nil {
return graphql.Null return graphql.Null
@ -3850,16 +3851,16 @@ func (ec *executionContext) _Dir(ctx context.Context, sel ast.SelectionSet, obj
switch obj := (obj).(type) { switch obj := (obj).(type) {
case nil: case nil:
return graphql.Null return graphql.Null
case model.SimpleDir: case fs.SimpleDir:
return ec._SimpleDir(ctx, sel, &obj) return ec._SimpleDir(ctx, sel, &obj)
case *model.SimpleDir: case *fs.SimpleDir:
if obj == nil { if obj == nil {
return graphql.Null return graphql.Null
} }
return ec._SimpleDir(ctx, sel, obj) return ec._SimpleDir(ctx, sel, obj)
case model.ResolverFs: case fs.ResolverFs:
return ec._ResolverFS(ctx, sel, &obj) return ec._ResolverFS(ctx, sel, &obj)
case *model.ResolverFs: case *fs.ResolverFs:
if obj == nil { if obj == nil {
return graphql.Null return graphql.Null
} }
@ -3873,9 +3874,9 @@ func (ec *executionContext) _File(ctx context.Context, sel ast.SelectionSet, obj
switch obj := (obj).(type) { switch obj := (obj).(type) {
case nil: case nil:
return graphql.Null return graphql.Null
case model.SimpleFile: case fs.SimpleFile:
return ec._SimpleFile(ctx, sel, &obj) return ec._SimpleFile(ctx, sel, &obj)
case *model.SimpleFile: case *fs.SimpleFile:
if obj == nil { if obj == nil {
return graphql.Null return graphql.Null
} }
@ -3889,23 +3890,23 @@ func (ec *executionContext) _FsEntry(ctx context.Context, sel ast.SelectionSet,
switch obj := (obj).(type) { switch obj := (obj).(type) {
case nil: case nil:
return graphql.Null return graphql.Null
case model.SimpleFile: case fs.SimpleFile:
return ec._SimpleFile(ctx, sel, &obj) return ec._SimpleFile(ctx, sel, &obj)
case *model.SimpleFile: case *fs.SimpleFile:
if obj == nil { if obj == nil {
return graphql.Null return graphql.Null
} }
return ec._SimpleFile(ctx, sel, obj) return ec._SimpleFile(ctx, sel, obj)
case model.SimpleDir: case fs.SimpleDir:
return ec._SimpleDir(ctx, sel, &obj) return ec._SimpleDir(ctx, sel, &obj)
case *model.SimpleDir: case *fs.SimpleDir:
if obj == nil { if obj == nil {
return graphql.Null return graphql.Null
} }
return ec._SimpleDir(ctx, sel, obj) return ec._SimpleDir(ctx, sel, obj)
case model.ResolverFs: case fs.ResolverFs:
return ec._ResolverFS(ctx, sel, &obj) return ec._ResolverFS(ctx, sel, &obj)
case *model.ResolverFs: case *fs.ResolverFs:
if obj == nil { if obj == nil {
return graphql.Null return graphql.Null
} }
@ -4128,7 +4129,7 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr
var resolverFSImplementors = []string{"ResolverFS", "Dir", "FsEntry"} var resolverFSImplementors = []string{"ResolverFS", "Dir", "FsEntry"}
func (ec *executionContext) _ResolverFS(ctx context.Context, sel ast.SelectionSet, obj *model.ResolverFs) graphql.Marshaler { func (ec *executionContext) _ResolverFS(ctx context.Context, sel ast.SelectionSet, obj *fs.ResolverFs) graphql.Marshaler {
fields := graphql.CollectFields(ec.OperationContext, sel, resolverFSImplementors) fields := graphql.CollectFields(ec.OperationContext, sel, resolverFSImplementors)
out := graphql.NewFieldSet(fields) out := graphql.NewFieldSet(fields)
@ -4241,7 +4242,7 @@ func (ec *executionContext) _Schema(ctx context.Context, sel ast.SelectionSet, o
var simpleDirImplementors = []string{"SimpleDir", "Dir", "FsEntry"} var simpleDirImplementors = []string{"SimpleDir", "Dir", "FsEntry"}
func (ec *executionContext) _SimpleDir(ctx context.Context, sel ast.SelectionSet, obj *model.SimpleDir) graphql.Marshaler { func (ec *executionContext) _SimpleDir(ctx context.Context, sel ast.SelectionSet, obj *fs.SimpleDir) graphql.Marshaler {
fields := graphql.CollectFields(ec.OperationContext, sel, simpleDirImplementors) fields := graphql.CollectFields(ec.OperationContext, sel, simpleDirImplementors)
out := graphql.NewFieldSet(fields) out := graphql.NewFieldSet(fields)
@ -4316,7 +4317,7 @@ func (ec *executionContext) _SimpleDir(ctx context.Context, sel ast.SelectionSet
var simpleFileImplementors = []string{"SimpleFile", "File", "FsEntry"} var simpleFileImplementors = []string{"SimpleFile", "File", "FsEntry"}
func (ec *executionContext) _SimpleFile(ctx context.Context, sel ast.SelectionSet, obj *model.SimpleFile) graphql.Marshaler { func (ec *executionContext) _SimpleFile(ctx context.Context, sel ast.SelectionSet, obj *fs.SimpleFile) graphql.Marshaler {
fields := graphql.CollectFields(ec.OperationContext, sel, simpleFileImplementors) fields := graphql.CollectFields(ec.OperationContext, sel, simpleFileImplementors)
out := graphql.NewFieldSet(fields) out := graphql.NewFieldSet(fields)

View file

@ -2,10 +2,6 @@
package model package model
import (
"git.kmsign.ru/royalcat/tstor/server/src/vfs"
)
type Dir interface { type Dir interface {
IsFsEntry() IsFsEntry()
IsDir() IsDir()
@ -47,65 +43,11 @@ type Plugin struct {
type Query struct { type Query struct {
} }
type ResolverFs struct {
Name string `json:"name"`
Entries []FsEntry `json:"entries"`
FS *vfs.ResolverFS `json:"-"`
}
func (ResolverFs) IsDir() {}
func (this ResolverFs) GetName() string { return this.Name }
func (this ResolverFs) GetEntries() []FsEntry {
if this.Entries == nil {
return nil
}
interfaceSlice := make([]FsEntry, 0, len(this.Entries))
for _, concrete := range this.Entries {
interfaceSlice = append(interfaceSlice, concrete)
}
return interfaceSlice
}
func (ResolverFs) IsFsEntry() {}
type Schema struct { type Schema struct {
Query *Query `json:"query,omitempty"` Query *Query `json:"query,omitempty"`
Mutation *Mutation `json:"mutation,omitempty"` Mutation *Mutation `json:"mutation,omitempty"`
} }
type SimpleDir struct {
Name string `json:"name"`
Entries []FsEntry `json:"entries"`
FS vfs.Filesystem `json:"-"`
Path string `json:"-"`
}
func (SimpleDir) IsDir() {}
func (this SimpleDir) GetName() string { return this.Name }
func (this SimpleDir) GetEntries() []FsEntry {
if this.Entries == nil {
return nil
}
interfaceSlice := make([]FsEntry, 0, len(this.Entries))
for _, concrete := range this.Entries {
interfaceSlice = append(interfaceSlice, concrete)
}
return interfaceSlice
}
func (SimpleDir) IsFsEntry() {}
type SimpleFile struct {
Name string `json:"name"`
Size int64 `json:"size"`
}
func (SimpleFile) IsFile() {}
func (this SimpleFile) GetName() string { return this.Name }
func (this SimpleFile) GetSize() int64 { return this.Size }
func (SimpleFile) IsFsEntry() {}
type Subscription struct { type Subscription struct {
} }

View file

@ -8,16 +8,17 @@ import (
"context" "context"
graph "git.kmsign.ru/royalcat/tstor/server/src/delivery/graphql" graph "git.kmsign.ru/royalcat/tstor/server/src/delivery/graphql"
"git.kmsign.ru/royalcat/tstor/server/src/delivery/graphql/fs"
"git.kmsign.ru/royalcat/tstor/server/src/delivery/graphql/model" "git.kmsign.ru/royalcat/tstor/server/src/delivery/graphql/model"
) )
// Entries is the resolver for the entries field. // Entries is the resolver for the entries field.
func (r *resolverFSResolver) Entries(ctx context.Context, obj *model.ResolverFs) ([]model.FsEntry, error) { func (r *resolverFSResolver) Entries(ctx context.Context, obj *fs.ResolverFs) ([]model.FsEntry, error) {
return obj.ResolverEntries(ctx) return obj.ResolverEntries(ctx)
} }
// Entries is the resolver for the entries field. // Entries is the resolver for the entries field.
func (r *simpleDirResolver) Entries(ctx context.Context, obj *model.SimpleDir) ([]model.FsEntry, error) { func (r *simpleDirResolver) Entries(ctx context.Context, obj *fs.SimpleDir) ([]model.FsEntry, error) {
return obj.SimpleDirEntries(ctx) return obj.SimpleDirEntries(ctx)
} }

View file

@ -9,6 +9,7 @@ import (
"fmt" "fmt"
graph "git.kmsign.ru/royalcat/tstor/server/src/delivery/graphql" graph "git.kmsign.ru/royalcat/tstor/server/src/delivery/graphql"
"git.kmsign.ru/royalcat/tstor/server/src/delivery/graphql/fs"
"git.kmsign.ru/royalcat/tstor/server/src/delivery/graphql/model" "git.kmsign.ru/royalcat/tstor/server/src/delivery/graphql/model"
) )
@ -24,7 +25,7 @@ func (r *queryResolver) FsEntry(ctx context.Context, path string) (model.FsEntry
return nil, err return nil, err
} }
return model.FillFsEntry(ctx, entry, r.VFS, path) return fs.FillFsEntry(ctx, entry, r.VFS, path)
} }
// Query returns graph.QueryResolver implementation. // Query returns graph.QueryResolver implementation.