diff --git a/.idea/dataSources.xml b/.idea/dataSources.xml index eac07d4..cce8574 100644 --- a/.idea/dataSources.xml +++ b/.idea/dataSources.xml @@ -1,13 +1,6 @@ - - sqlite.xerial - true - org.sqlite.JDBC - jdbc:sqlite:$PROJECT_DIR$/obst.db - $ProjectFileDir$ - mariadb true diff --git a/gqlgen.yml b/gqlgen.yml index 8b8a85f..0136fe8 100644 --- a/gqlgen.yml +++ b/gqlgen.yml @@ -97,3 +97,5 @@ models: resolver: true banner: resolver: true + variety: + resolver: true diff --git a/graph/generated.go b/graph/generated.go index f74a8e9..fce1b68 100644 --- a/graph/generated.go +++ b/graph/generated.go @@ -140,6 +140,7 @@ type QueryResolver interface { type TreeResolver interface { Events(ctx context.Context, obj *model.Tree) ([]*model.Event, error) Banner(ctx context.Context, obj *model.Tree) (*model.File, error) + Variety(ctx context.Context, obj *model.Tree) (*model.Variety, error) } type executableSchema struct { @@ -2972,7 +2973,7 @@ func (ec *executionContext) _Tree_variety(ctx context.Context, field graphql.Col }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { ctx = rctx // use context from middleware stack in children - return obj.Variety, nil + return ec.resolvers.Tree().Variety(rctx, obj) }) if err != nil { ec.Error(ctx, err) @@ -2990,8 +2991,8 @@ func (ec *executionContext) fieldContext_Tree_variety(ctx context.Context, field fc = &graphql.FieldContext{ Object: "Tree", Field: field, - IsMethod: false, - IsResolver: false, + IsMethod: true, + IsResolver: true, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { switch field.Name { case "id": @@ -5849,7 +5850,38 @@ func (ec *executionContext) _Tree(ctx context.Context, sel ast.SelectionSet, obj out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) case "variety": - out.Values[i] = ec._Tree_variety(ctx, field, obj) + field := field + + innerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + } + }() + res = ec._Tree_variety(ctx, field, obj) + return res + } + + if field.Deferrable != nil { + dfs, ok := deferred[field.Deferrable.Label] + di := 0 + if ok { + dfs.AddField(field) + di = len(dfs.Values) - 1 + } else { + dfs = graphql.NewFieldSet([]graphql.CollectedField{field}) + deferred[field.Deferrable.Label] = dfs + } + dfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler { + return innerFunc(ctx, dfs) + }) + + // don't run the out.Concurrently() call below + out.Values[i] = graphql.Null + continue + } + + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) default: panic("unknown field " + strconv.Quote(field.Name)) } diff --git a/graph/schema.resolvers.go b/graph/schema.resolvers.go index f9fa2d6..bf25c60 100644 --- a/graph/schema.resolvers.go +++ b/graph/schema.resolvers.go @@ -6,8 +6,6 @@ package graph import ( "context" - "fmt" - "github.com/99designs/gqlgen/graphql" "github.com/BurrrY/obstwiesen-server/graph/model" "github.com/BurrrY/obstwiesen-server/internal/config" @@ -123,7 +121,20 @@ func (r *mutationResolver) MultipleUpload(ctx context.Context, parentID string, // CreateVariety is the resolver for the createVariety field. func (r *mutationResolver) CreateVariety(ctx context.Context, input model.VarietyInput) (*model.Variety, error) { - panic(fmt.Errorf("not implemented: CreateVariety - createVariety")) + eventID, _ := gonanoid.New() + + elemnt := &model.Variety{ + ID: eventID, + Name: input.Name, + } + + if input.Parent != nil { + elemnt.Parent = *input.Parent + } + + err := storage.AddVariety(elemnt) + + return elemnt, err } // Meadow is the resolver for the meadow field. @@ -143,7 +154,9 @@ func (r *queryResolver) Meadows(ctx context.Context) ([]*model.Meadow, error) { // Varieties is the resolver for the varieties field. func (r *queryResolver) Varieties(ctx context.Context) ([]*model.Variety, error) { - panic(fmt.Errorf("not implemented: Varieties - varieties")) + var data []*model.Variety + data, err := storage.GetVarieties(ctx) + return data, err } // Trees is the resolver for the trees field. @@ -201,6 +214,11 @@ func (r *treeResolver) Banner(ctx context.Context, obj *model.Tree) (*model.File return file, err } +// Variety is the resolver for the variety field. +func (r *treeResolver) Variety(ctx context.Context, obj *model.Tree) (*model.Variety, error) { + return storage.GetVarietyOfTree(obj.ID) +} + // Meadow returns MeadowResolver implementation. func (r *Resolver) Meadow() MeadowResolver { return &meadowResolver{r} } diff --git a/internal/data_store/data_store_interface.go b/internal/data_store/data_store_interface.go index b98e98d..24e1b96 100644 --- a/internal/data_store/data_store_interface.go +++ b/internal/data_store/data_store_interface.go @@ -18,4 +18,7 @@ type Storage interface { Setup() UpdateTree(id string, input model.TreeInput) (*model.Tree, error) UpdateMeadow(ctx context.Context, id string, input model.MeadowInput) (*model.Meadow, error) + AddVariety(elemnt *model.Variety) error + GetVarieties(ctx context.Context) ([]*model.Variety, error) + GetVarietyOfTree(id string) (*model.Variety, error) } diff --git a/internal/data_store/mysql/dbHistory.go b/internal/data_store/mysql/dbHistory.go index c04de3e..5f9d4f6 100644 --- a/internal/data_store/mysql/dbHistory.go +++ b/internal/data_store/mysql/dbHistory.go @@ -20,8 +20,8 @@ var history = [...]string{ "CREATE TABLE IF NOT EXISTS `trees` ( `id` varchar(21) NOT NULL, `name` varchar(255) NOT NULL, `meadow_id` varchar(21) NOT NULL, `created_at` datetime DEFAULT NULL, `lat` decimal(10,7) DEFAULT NULL, `lang` decimal(10,7) DEFAULT NULL, PRIMARY KEY (`id`), KEY `FK_trees_meadows` (`meadow_id`), CONSTRAINT `FK_trees_meadows` FOREIGN KEY (`meadow_id`) REFERENCES `meadows` (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;", "CREATE TABLE IF NOT EXISTS `version` ( `version` int(11) DEFAULT 0, `timestamp` datetime DEFAULT current_timestamp()) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;", "ALTER TABLE `meadows` ADD COLUMN `area` JSON NULL AFTER `name`;", - "CREATE TABLE `variants` ( `id` VARCHAR(21) NOT NULL, `name` VARCHAR(200) NOT NULL, `parent` VARCHAR(21) NULL, PRIMARY KEY (`id`) );", - "ALTER TABLE `trees` ADD COLUMN `variant` VARCHAR(21) NULL DEFAULT NULL, ADD CONSTRAINT `FK_trees_variants` FOREIGN KEY (`variant`) REFERENCES `variants` (`id`);", + "CREATE TABLE `varieties` ( `id` VARCHAR(21) NOT NULL, `name` VARCHAR(200) NOT NULL, `parent` VARCHAR(21) NULL, PRIMARY KEY (`id`) );", + "ALTER TABLE `trees` ADD COLUMN `variety` VARCHAR(21) NULL DEFAULT NULL, ADD CONSTRAINT `FK_trees_varieties` FOREIGN KEY (`variety`) REFERENCES `varieties` (`id`);", } func updateDb() { diff --git a/internal/data_store/mysql/queries.go b/internal/data_store/mysql/queries.go index 1d150f0..005b0ba 100644 --- a/internal/data_store/mysql/queries.go +++ b/internal/data_store/mysql/queries.go @@ -16,6 +16,16 @@ func (m stor) StoreMeadow(meadow *model.Meadow) { } } +func (m stor) AddVariety(elemnt *model.Variety) error { + _, err := db.Exec("INSERT INTO varieties ( id, name, parent) VALUES (?, ?, ?)", elemnt.ID, elemnt.Name, elemnt.Parent) + if err != nil { + log.Warning("Error in AddVariety: ", err) + return err + } + + return nil +} + func (m stor) UpdateMeadow(ctx context.Context, id string, input model.MeadowInput) (*model.Meadow, error) { jsondata, _ := json.Marshal(input.Area) @@ -53,8 +63,8 @@ func (m stor) AddTree(tree *model.Tree, id string) { } func (m stor) UpdateTree(id string, input model.TreeInput) (*model.Tree, error) { - _, err := db.Exec("UPDATE trees SET name = ?, lat = ?, lang = ? WHERE id = ?", - input.Name, input.Lat, input.Lang, id) + _, err := db.Exec("UPDATE trees SET name = coalesce(?, name),lat = coalesce(?, lat), lang = coalesce(?, lang), variety = coalesce(?, variety) WHERE id = ?", + input.Name, input.Lat, input.Lang, input.Variety, id) if err != nil { log.Warning("Error in AddTree: ", err) @@ -64,6 +74,23 @@ func (m stor) UpdateTree(id string, input model.TreeInput) (*model.Tree, error) return m.GetTreeByID(id) } +func (m stor) GetVarietyOfTree(id string) (*model.Variety, error) { + + d := &model.Variety{} + err := db.Get(d, "SELECT v.* FROM varieties v JOIN trees t ON t.variety = v.id AND t.id = ?", id) + log.Info("Variety!", d, err) + if err != nil { + if err.Error() == "sql: no rows in result set" { + return nil, nil + } else { + log.Warning("GetVarietyOfTree", err) + } + + } + + return d, err +} + func (m stor) GetTreesOfMeadow(id string) ([]*model.Tree, error) { trees := []*model.Tree{} @@ -104,6 +131,14 @@ func (m stor) GetMeadows() ([]*model.Meadow, error) { return meadows, err } +func (m stor) GetVarieties(ctx context.Context) ([]*model.Variety, error) { + + var raw []*model.Variety + err := db.Select(&raw, "SELECT id, name, parent FROM varieties ORDER BY name") + + return raw, err +} + func toMeadowModel(meadow *GetMeadow) *model.Meadow { data := &model.Meadow{ diff --git a/internal/data_store/storageHandler.go b/internal/data_store/storageHandler.go index 4526a02..3c4a84d 100644 --- a/internal/data_store/storageHandler.go +++ b/internal/data_store/storageHandler.go @@ -3,7 +3,6 @@ package storage import ( "github.com/BurrrY/obstwiesen-server/internal/config" "github.com/BurrrY/obstwiesen-server/internal/data_store/mysql" - "github.com/BurrrY/obstwiesen-server/internal/data_store/sqlite" log "github.com/sirupsen/logrus" "github.com/spf13/viper" ) @@ -13,9 +12,12 @@ func GetProvider() (*Storage, error) { dbProvider := viper.GetString(config.DB_PROVIDER) + /* DEPRECATED if dbProvider == "sqlite" { result = &sqlite.Connection - } else if dbProvider == "mysql" { + } else*/ + + if dbProvider == "mysql" { result = &mysql.Connection } else { log.WithFields(log.Fields{