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:
- "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 (
"context"
"git.kmsign.ru/royalcat/tstor/server/src/delivery/graphql/model"
"git.kmsign.ru/royalcat/tstor/server/src/vfs"
)
@ -11,7 +12,7 @@ type FsElem interface {
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) {
case *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)
if err != nil {
return nil, err
}
out := []FsEntry{}
out := []model.FsEntry{}
for _, e := range entries {
entry, err := FillFsEntry(ctx, e, fs, ".")
if err != nil {
@ -69,12 +70,12 @@ func ReadEntries(ctx context.Context, fs vfs.Filesystem, path string) ([]FsEntry
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, ".")
if err != nil {
return nil, err
}
out := []FsEntry{}
out := []model.FsEntry{}
for _, e := range entries {
entry, err := FillFsEntry(ctx, e, obj.FS, ".")
if err != nil {
@ -85,12 +86,12 @@ func (obj *ResolverFs) ResolverEntries(ctx context.Context) ([]FsEntry, error) {
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)
if err != nil {
return nil, err
}
out := []FsEntry{}
out := []model.FsEntry{}
for _, e := range entries {
entry, err := FillFsEntry(ctx, e, obj.FS, obj.Path)
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"
"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"
"github.com/99designs/gqlgen/graphql"
"github.com/99designs/gqlgen/graphql/introspection"
@ -107,10 +108,10 @@ type QueryResolver interface {
FsEntry(ctx context.Context, path string) (model.FsEntry, error)
}
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 {
Entries(ctx context.Context, obj *model.SimpleDir) ([]model.FsEntry, error)
Entries(ctx context.Context, obj *fs.SimpleDir) ([]model.FsEntry, error)
}
type SubscriptionResolver interface {
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
}
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)
if err != nil {
return graphql.Null
@ -1222,7 +1223,7 @@ func (ec *executionContext) fieldContext_ResolverFS_name(_ context.Context, fiel
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)
if err != nil {
return graphql.Null
@ -1364,7 +1365,7 @@ func (ec *executionContext) fieldContext_Schema_mutation(_ context.Context, fiel
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)
if err != nil {
return graphql.Null
@ -1408,7 +1409,7 @@ func (ec *executionContext) fieldContext_SimpleDir_name(_ context.Context, field
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)
if err != nil {
return graphql.Null
@ -1474,7 +1475,7 @@ func (ec *executionContext) fieldContext_SimpleDir_entries(_ context.Context, fi
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)
if err != nil {
return graphql.Null
@ -1518,7 +1519,7 @@ func (ec *executionContext) fieldContext_SimpleFile_name(_ context.Context, fiel
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)
if err != nil {
return graphql.Null
@ -3850,16 +3851,16 @@ func (ec *executionContext) _Dir(ctx context.Context, sel ast.SelectionSet, obj
switch obj := (obj).(type) {
case nil:
return graphql.Null
case model.SimpleDir:
case fs.SimpleDir:
return ec._SimpleDir(ctx, sel, &obj)
case *model.SimpleDir:
case *fs.SimpleDir:
if obj == nil {
return graphql.Null
}
return ec._SimpleDir(ctx, sel, obj)
case model.ResolverFs:
case fs.ResolverFs:
return ec._ResolverFS(ctx, sel, &obj)
case *model.ResolverFs:
case *fs.ResolverFs:
if obj == nil {
return graphql.Null
}
@ -3873,9 +3874,9 @@ func (ec *executionContext) _File(ctx context.Context, sel ast.SelectionSet, obj
switch obj := (obj).(type) {
case nil:
return graphql.Null
case model.SimpleFile:
case fs.SimpleFile:
return ec._SimpleFile(ctx, sel, &obj)
case *model.SimpleFile:
case *fs.SimpleFile:
if obj == nil {
return graphql.Null
}
@ -3889,23 +3890,23 @@ func (ec *executionContext) _FsEntry(ctx context.Context, sel ast.SelectionSet,
switch obj := (obj).(type) {
case nil:
return graphql.Null
case model.SimpleFile:
case fs.SimpleFile:
return ec._SimpleFile(ctx, sel, &obj)
case *model.SimpleFile:
case *fs.SimpleFile:
if obj == nil {
return graphql.Null
}
return ec._SimpleFile(ctx, sel, obj)
case model.SimpleDir:
case fs.SimpleDir:
return ec._SimpleDir(ctx, sel, &obj)
case *model.SimpleDir:
case *fs.SimpleDir:
if obj == nil {
return graphql.Null
}
return ec._SimpleDir(ctx, sel, obj)
case model.ResolverFs:
case fs.ResolverFs:
return ec._ResolverFS(ctx, sel, &obj)
case *model.ResolverFs:
case *fs.ResolverFs:
if obj == nil {
return graphql.Null
}
@ -4128,7 +4129,7 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr
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)
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"}
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)
out := graphql.NewFieldSet(fields)
@ -4316,7 +4317,7 @@ func (ec *executionContext) _SimpleDir(ctx context.Context, sel ast.SelectionSet
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)
out := graphql.NewFieldSet(fields)

View file

@ -2,10 +2,6 @@
package model
import (
"git.kmsign.ru/royalcat/tstor/server/src/vfs"
)
type Dir interface {
IsFsEntry()
IsDir()
@ -47,65 +43,11 @@ type Plugin 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 {
Query *Query `json:"query,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 {
}

View file

@ -8,16 +8,17 @@ import (
"context"
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"
)
// 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)
}
// 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)
}

View file

@ -9,6 +9,7 @@ import (
"fmt"
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"
)
@ -24,7 +25,7 @@ func (r *queryResolver) FsEntry(ctx context.Context, path string) (model.FsEntry
return nil, err
}
return model.FillFsEntry(ctx, entry, r.VFS, path)
return fs.FillFsEntry(ctx, entry, r.VFS, path)
}
// Query returns graph.QueryResolver implementation.