From a4be2082f2ea1f738784106bb67e11813f34e68c Mon Sep 17 00:00:00 2001 From: Erik Vattekar Date: Tue, 5 Dec 2023 10:46:36 +0100 Subject: [PATCH] changed to fetching product area id from teamkatalog api with our cache --- cmd/nada-backend/main.go | 3 - pkg/database/dataproducts.go | 43 +------------ pkg/database/gensql/insight_products.sql.go | 37 ++++------- pkg/database/gensql/models.go | 1 - pkg/database/insight_product.go | 8 +-- .../0078_remove_product_area_id.sql | 11 ++++ .../migrations/0078_team_pa_mapping_table.sql | 36 ----------- pkg/database/quarto.go | 25 +------- pkg/database/queries/insight_products.sql | 5 +- pkg/database/search.go | 5 +- pkg/database/story.go | 23 +------ pkg/graph/generated/generated.go | 61 +++++++++++++++---- pkg/graph/group.resolvers.go | 7 +-- pkg/graph/insight_product.resolvers.go | 21 +++++++ pkg/graph/models/insight_product.go | 2 - pkg/graph/productAreas.resolvers.go | 6 +- pkg/graph/quarto_story.resolvers.go | 6 +- pkg/httpwithcache/httpclient.go | 1 - pkg/productareaupdater/productareaupdater.go | 58 ------------------ 19 files changed, 114 insertions(+), 245 deletions(-) create mode 100644 pkg/database/migrations/0078_remove_product_area_id.sql delete mode 100644 pkg/database/migrations/0078_team_pa_mapping_table.sql delete mode 100644 pkg/productareaupdater/productareaupdater.go diff --git a/cmd/nada-backend/main.go b/cmd/nada-backend/main.go index 2820660c..3a327308 100644 --- a/cmd/nada-backend/main.go +++ b/cmd/nada-backend/main.go @@ -23,7 +23,6 @@ import ( "github.com/navikt/nada-backend/pkg/httpwithcache" "github.com/navikt/nada-backend/pkg/metabase" "github.com/navikt/nada-backend/pkg/polly" - "github.com/navikt/nada-backend/pkg/productareaupdater" "github.com/navikt/nada-backend/pkg/slack" "github.com/navikt/nada-backend/pkg/story" "github.com/navikt/nada-backend/pkg/teamkatalogen" @@ -46,7 +45,6 @@ var ( const ( TeamProjectsUpdateFrequency = 60 * time.Minute - ProductAreaUpdateFrequency = 10 * time.Minute AccessEnsurerFrequency = 5 * time.Minute MetabaseUpdateFrequency = 1 * time.Hour StoryDraftCleanerFrequency = 24 * time.Hour @@ -126,7 +124,6 @@ func main() { amplitudeClient = amplitude.NewMock() if !cfg.MockAuth { teamcatalogue = teamkatalogen.New(cfg.TeamkatalogenURL) - go productareaupdater.New(repo, teamcatalogue, log.WithField("subsystem", "productareaupdater")).Run(ctx, ProductAreaUpdateFrequency) teamProjectsUpdater = teamprojectsupdater.NewTeamProjectsUpdater(ctx, cfg.ConsoleURL, cfg.ConsoleAPIKey, http.DefaultClient, repo) go teamProjectsUpdater.Run(ctx, TeamProjectsUpdateFrequency) diff --git a/pkg/database/dataproducts.go b/pkg/database/dataproducts.go index 43ba8fab..670fe674 100644 --- a/pkg/database/dataproducts.go +++ b/pkg/database/dataproducts.go @@ -84,14 +84,7 @@ func (r *Repo) GetDataproduct(ctx context.Context, id uuid.UUID) (*models.Datapr } func (r *Repo) CreateDataproduct(ctx context.Context, dp models.NewDataproduct, user *auth.User) (*models.Dataproduct, error) { - tx, err := r.db.Begin() - if err != nil { - return nil, err - } - - querier := r.querier.WithTx(tx) - - dataproduct, err := querier.CreateDataproduct(ctx, gensql.CreateDataproductParams{ + dataproduct, err := r.querier.CreateDataproduct(ctx, gensql.CreateDataproductParams{ Name: dp.Name, Description: ptrToNullString(dp.Description), OwnerGroup: dp.Group, @@ -101,20 +94,6 @@ func (r *Repo) CreateDataproduct(ctx context.Context, dp models.NewDataproduct, TeamID: ptrToNullString(dp.TeamID), }) if err != nil { - if err := tx.Rollback(); err != nil { - r.log.WithError(err).Error("rolling back dataproduct creation") - } - return nil, err - } - - if err := r.CreateTeamProductAreaMappingIfNotExists(ctx, tx, dp.TeamID, dp.ProductAreaID); err != nil { - if err := tx.Rollback(); err != nil { - r.log.WithError(err).Error("rolling back quarto metadata update") - } - return nil, err - } - - if err := tx.Commit(); err != nil { return nil, err } @@ -122,14 +101,7 @@ func (r *Repo) CreateDataproduct(ctx context.Context, dp models.NewDataproduct, } func (r *Repo) UpdateDataproduct(ctx context.Context, id uuid.UUID, new models.UpdateDataproduct) (*models.Dataproduct, error) { - tx, err := r.db.Begin() - if err != nil { - return nil, err - } - - querier := r.querier.WithTx(tx) - - res, err := querier.UpdateDataproduct(ctx, gensql.UpdateDataproductParams{ + res, err := r.querier.UpdateDataproduct(ctx, gensql.UpdateDataproductParams{ Name: new.Name, Description: ptrToNullString(new.Description), ID: id, @@ -142,17 +114,6 @@ func (r *Repo) UpdateDataproduct(ctx context.Context, id uuid.UUID, new models.U return nil, fmt.Errorf("updating dataproduct in database: %w", err) } - if err := r.CreateTeamProductAreaMappingIfNotExists(ctx, tx, new.TeamID, new.ProductAreaID); err != nil { - if err := tx.Rollback(); err != nil { - r.log.WithError(err).Error("rolling back quarto metadata update") - } - return nil, err - } - - if err := tx.Commit(); err != nil { - return nil, err - } - return dataproductFromSQL(res), nil } diff --git a/pkg/database/gensql/insight_products.sql.go b/pkg/database/gensql/insight_products.sql.go index 96ff728a..7b50c3c5 100644 --- a/pkg/database/gensql/insight_products.sql.go +++ b/pkg/database/gensql/insight_products.sql.go @@ -24,7 +24,6 @@ INSERT INTO "keywords", "group", "teamkatalogen_url", - "product_area_id", "team_id" ) VALUES @@ -37,9 +36,8 @@ VALUES $6, $7, $8, - $9, - $10 - ) RETURNING id, name, description, creator, created, last_modified, type, tsv_document, link, keywords, "group", teamkatalogen_url, product_area_id, team_id + $9 + ) RETURNING id, name, description, creator, created, last_modified, type, tsv_document, link, keywords, "group", teamkatalogen_url, team_id ` type CreateInsightProductParams struct { @@ -51,7 +49,6 @@ type CreateInsightProductParams struct { Keywords []string OwnerGroup string TeamkatalogenUrl sql.NullString - ProductAreaID sql.NullString TeamID sql.NullString } @@ -65,7 +62,6 @@ func (q *Queries) CreateInsightProduct(ctx context.Context, arg CreateInsightPro pq.Array(arg.Keywords), arg.OwnerGroup, arg.TeamkatalogenUrl, - arg.ProductAreaID, arg.TeamID, ) var i InsightProduct @@ -82,7 +78,6 @@ func (q *Queries) CreateInsightProduct(ctx context.Context, arg CreateInsightPro pq.Array(&i.Keywords), &i.Group, &i.TeamkatalogenUrl, - &i.ProductAreaID, &i.TeamID, ) return i, err @@ -102,7 +97,7 @@ func (q *Queries) DeleteInsightProduct(ctx context.Context, id uuid.UUID) error const getInsightProduct = `-- name: GetInsightProduct :one SELECT - id, name, description, creator, created, last_modified, type, tsv_document, link, keywords, "group", teamkatalogen_url, product_area_id, team_id + id, name, description, creator, created, last_modified, type, tsv_document, link, keywords, "group", teamkatalogen_url, team_id FROM insight_product WHERE @@ -125,7 +120,6 @@ func (q *Queries) GetInsightProduct(ctx context.Context, id uuid.UUID) (InsightP pq.Array(&i.Keywords), &i.Group, &i.TeamkatalogenUrl, - &i.ProductAreaID, &i.TeamID, ) return i, err @@ -133,7 +127,7 @@ func (q *Queries) GetInsightProduct(ctx context.Context, id uuid.UUID) (InsightP const getInsightProductByGroups = `-- name: GetInsightProductByGroups :many SELECT - id, name, description, creator, created, last_modified, type, tsv_document, link, keywords, "group", teamkatalogen_url, product_area_id, team_id + id, name, description, creator, created, last_modified, type, tsv_document, link, keywords, "group", teamkatalogen_url, team_id FROM insight_product WHERE @@ -164,7 +158,6 @@ func (q *Queries) GetInsightProductByGroups(ctx context.Context, groups []string pq.Array(&i.Keywords), &i.Group, &i.TeamkatalogenUrl, - &i.ProductAreaID, &i.TeamID, ); err != nil { return nil, err @@ -182,7 +175,7 @@ func (q *Queries) GetInsightProductByGroups(ctx context.Context, groups []string const getInsightProducts = `-- name: GetInsightProducts :many SELECT - id, name, description, creator, created, last_modified, type, tsv_document, link, keywords, "group", teamkatalogen_url, product_area_id, team_id + id, name, description, creator, created, last_modified, type, tsv_document, link, keywords, "group", teamkatalogen_url, team_id FROM insight_product ORDER BY @@ -211,7 +204,6 @@ func (q *Queries) GetInsightProducts(ctx context.Context) ([]InsightProduct, err pq.Array(&i.Keywords), &i.Group, &i.TeamkatalogenUrl, - &i.ProductAreaID, &i.TeamID, ); err != nil { return nil, err @@ -229,7 +221,7 @@ func (q *Queries) GetInsightProducts(ctx context.Context) ([]InsightProduct, err const getInsightProductsByIDs = `-- name: GetInsightProductsByIDs :many SELECT - id, name, description, creator, created, last_modified, type, tsv_document, link, keywords, "group", teamkatalogen_url, product_area_id, team_id + id, name, description, creator, created, last_modified, type, tsv_document, link, keywords, "group", teamkatalogen_url, team_id FROM insight_product WHERE @@ -260,7 +252,6 @@ func (q *Queries) GetInsightProductsByIDs(ctx context.Context, ids []uuid.UUID) pq.Array(&i.Keywords), &i.Group, &i.TeamkatalogenUrl, - &i.ProductAreaID, &i.TeamID, ); err != nil { return nil, err @@ -278,11 +269,11 @@ func (q *Queries) GetInsightProductsByIDs(ctx context.Context, ids []uuid.UUID) const getInsightProductsByProductArea = `-- name: GetInsightProductsByProductArea :many SELECT - id, name, description, creator, created, last_modified, type, tsv_document, link, keywords, "group", teamkatalogen_url, product_area_id, team_id + id, name, description, creator, created, last_modified, type, tsv_document, link, keywords, "group", teamkatalogen_url, team_id FROM insight_product WHERE - product_area_id = $1 + team_id = ANY(SELECT team_id FROM team_productarea_mapping WHERE product_area_id = $1) ORDER BY last_modified DESC ` @@ -309,7 +300,6 @@ func (q *Queries) GetInsightProductsByProductArea(ctx context.Context, productAr pq.Array(&i.Keywords), &i.Group, &i.TeamkatalogenUrl, - &i.ProductAreaID, &i.TeamID, ); err != nil { return nil, err @@ -327,7 +317,7 @@ func (q *Queries) GetInsightProductsByProductArea(ctx context.Context, productAr const getInsightProductsByTeam = `-- name: GetInsightProductsByTeam :many SELECT - id, name, description, creator, created, last_modified, type, tsv_document, link, keywords, "group", teamkatalogen_url, product_area_id, team_id + id, name, description, creator, created, last_modified, type, tsv_document, link, keywords, "group", teamkatalogen_url, team_id FROM insight_product WHERE @@ -358,7 +348,6 @@ func (q *Queries) GetInsightProductsByTeam(ctx context.Context, teamID sql.NullS pq.Array(&i.Keywords), &i.Group, &i.TeamkatalogenUrl, - &i.ProductAreaID, &i.TeamID, ); err != nil { return nil, err @@ -385,10 +374,9 @@ SET "link" = $5, "keywords" = $6, "teamkatalogen_url" = $7, - "product_area_id" = $8, - "team_id" = $9 + "team_id" = $8 WHERE - id = $10 RETURNING id, name, description, creator, created, last_modified, type, tsv_document, link, keywords, "group", teamkatalogen_url, product_area_id, team_id + id = $9 RETURNING id, name, description, creator, created, last_modified, type, tsv_document, link, keywords, "group", teamkatalogen_url, team_id ` type UpdateInsightProductParams struct { @@ -399,7 +387,6 @@ type UpdateInsightProductParams struct { Link string Keywords []string TeamkatalogenUrl sql.NullString - ProductAreaID sql.NullString TeamID sql.NullString ID uuid.UUID } @@ -413,7 +400,6 @@ func (q *Queries) UpdateInsightProduct(ctx context.Context, arg UpdateInsightPro arg.Link, pq.Array(arg.Keywords), arg.TeamkatalogenUrl, - arg.ProductAreaID, arg.TeamID, arg.ID, ) @@ -431,7 +417,6 @@ func (q *Queries) UpdateInsightProduct(ctx context.Context, arg UpdateInsightPro pq.Array(&i.Keywords), &i.Group, &i.TeamkatalogenUrl, - &i.ProductAreaID, &i.TeamID, ) return i, err diff --git a/pkg/database/gensql/models.go b/pkg/database/gensql/models.go index a1bba408..5d2bae8e 100644 --- a/pkg/database/gensql/models.go +++ b/pkg/database/gensql/models.go @@ -288,7 +288,6 @@ type InsightProduct struct { Keywords []string Group string TeamkatalogenUrl sql.NullString - ProductAreaID sql.NullString TeamID sql.NullString } diff --git a/pkg/database/insight_product.go b/pkg/database/insight_product.go index 1d57bd9a..1304c73f 100644 --- a/pkg/database/insight_product.go +++ b/pkg/database/insight_product.go @@ -18,13 +18,15 @@ func (r *Repo) CreateInsightProduct(ctx context.Context, creator string, Keywords: newInsightProduct.Keywords, OwnerGroup: newInsightProduct.Group, TeamkatalogenUrl: ptrToNullString(newInsightProduct.TeamkatalogenURL), - ProductAreaID: ptrToNullString(newInsightProduct.ProductAreaID), TeamID: ptrToNullString(newInsightProduct.TeamID), Type: newInsightProduct.Type, Link: newInsightProduct.Link, }) + if err != nil { + return nil, err + } - return InsightProductSQLToGraphql(&insightProductSQL), err + return InsightProductSQLToGraphql(&insightProductSQL), nil } func (r *Repo) GetInsightProduct(ctx context.Context, id uuid.UUID) (*models.InsightProduct, error) { @@ -61,7 +63,6 @@ func (r *Repo) UpdateInsightProductMetadata(ctx context.Context, id uuid.UUID, n Description: ptrToNullString(&description), Keywords: keywords, TeamkatalogenUrl: ptrToNullString(teamkatalogenURL), - ProductAreaID: ptrToNullString(productAreaID), TeamID: ptrToNullString(teamID), Type: insightProductType, Link: link, @@ -129,7 +130,6 @@ func InsightProductSQLToGraphql(insightProductSQL *gensql.InsightProduct) *model Type: insightProductSQL.Type, Keywords: insightProductSQL.Keywords, TeamkatalogenURL: nullStringToPtr(insightProductSQL.TeamkatalogenUrl), - ProductAreaID: nullStringToPtr(insightProductSQL.ProductAreaID), TeamID: nullStringToPtr(insightProductSQL.TeamID), Group: insightProductSQL.Group, Link: insightProductSQL.Link, diff --git a/pkg/database/migrations/0078_remove_product_area_id.sql b/pkg/database/migrations/0078_remove_product_area_id.sql new file mode 100644 index 00000000..0ce9f88f --- /dev/null +++ b/pkg/database/migrations/0078_remove_product_area_id.sql @@ -0,0 +1,11 @@ +-- +goose Up +ALTER TABLE dataproducts DROP COLUMN product_area_id; +ALTER TABLE quarto_stories DROP COLUMN product_area_id; +ALTER TABLE stories DROP COLUMN product_area_id; +ALTER TABLE insight_product DROP COLUMN product_area_id; + +-- +goose Down +ALTER TABLE dataproducts ADD COLUMN product_area_id TEXT; +ALTER TABLE quarto_stories ADD COLUMN product_area_id TEXT; +ALTER TABLE stories ADD COLUMN product_area_id TEXT; +ALTER TABLE insight_product ADD COLUMN product_area_id TEXT; diff --git a/pkg/database/migrations/0078_team_pa_mapping_table.sql b/pkg/database/migrations/0078_team_pa_mapping_table.sql deleted file mode 100644 index abf24054..00000000 --- a/pkg/database/migrations/0078_team_pa_mapping_table.sql +++ /dev/null @@ -1,36 +0,0 @@ --- +goose Up -CREATE TABLE "team_productarea_mapping" ( - "team_id" TEXT NOT NULL, - "product_area_id" TEXT, - PRIMARY KEY(team_id) -); - -WITH combined_team_pa AS ( - SELECT DISTINCT(team_id), product_area_id FROM dataproducts WHERE team_id <> '' - UNION - SELECT DISTINCT(team_id), product_area_id FROM quarto_stories WHERE team_id <> '' - UNION - SELECT DISTINCT(team_id), product_area_id FROM stories WHERE team_id <> '' -) -INSERT INTO team_productarea_mapping (team_id, product_area_id) -(SELECT team_id, product_area_id FROM combined_team_pa); - -ALTER TABLE dataproducts DROP COLUMN product_area_id; -ALTER TABLE quarto_stories DROP COLUMN product_area_id; -ALTER TABLE stories DROP COLUMN product_area_id; - --- +goose Down -ALTER TABLE dataproducts ADD COLUMN product_area_id TEXT; -ALTER TABLE quarto_stories ADD COLUMN product_area_id TEXT; -ALTER TABLE stories ADD COLUMN product_area_id TEXT; - -UPDATE dataproducts dp -SET "product_area_id" = (SELECT product_area_id FROM "team_productarea_mapping" WHERE team_id = dp.team_id); - -UPDATE quarto_stories qs -SET "product_area_id" = (SELECT product_area_id FROM "team_productarea_mapping" WHERE team_id = qs.team_id); - -UPDATE stories s -SET "product_area_id" = (SELECT product_area_id FROM "team_productarea_mapping" WHERE team_id = s.team_id); - -DROP TABLE "team_productarea_mapping"; diff --git a/pkg/database/quarto.go b/pkg/database/quarto.go index aa639b8a..6534bfcc 100644 --- a/pkg/database/quarto.go +++ b/pkg/database/quarto.go @@ -12,15 +12,10 @@ import ( func (r *Repo) CreateQuartoStory(ctx context.Context, creator string, newQuartoStory models.NewQuartoStory, ) (*models.QuartoStory, error) { - tx, err := r.db.Begin() - if err != nil { - return nil, err - } - querier := r.querier.WithTx(tx) - var quartoSQL gensql.QuartoStory + var err error if newQuartoStory.ID == nil { - quartoSQL, err = querier.CreateQuartoStory(ctx, gensql.CreateQuartoStoryParams{ + quartoSQL, err = r.querier.CreateQuartoStory(ctx, gensql.CreateQuartoStoryParams{ Name: newQuartoStory.Name, Creator: creator, Description: ptrToString(newQuartoStory.Description), @@ -30,7 +25,7 @@ func (r *Repo) CreateQuartoStory(ctx context.Context, creator string, OwnerGroup: newQuartoStory.Group, }) } else { - quartoSQL, err = querier.CreateQuartoStoryWithID(ctx, gensql.CreateQuartoStoryWithIDParams{ + quartoSQL, err = r.querier.CreateQuartoStoryWithID(ctx, gensql.CreateQuartoStoryWithIDParams{ ID: *newQuartoStory.ID, Name: newQuartoStory.Name, Creator: creator, @@ -42,20 +37,6 @@ func (r *Repo) CreateQuartoStory(ctx context.Context, creator string, }) } if err != nil { - if err := tx.Rollback(); err != nil { - r.log.WithError(err).Error("rolling back quarto create") - } - return nil, err - } - - if err := r.CreateTeamProductAreaMappingIfNotExists(ctx, tx, newQuartoStory.TeamID, newQuartoStory.ProductAreaID); err != nil { - if err := tx.Rollback(); err != nil { - r.log.WithError(err).Error("rolling back quarto metadata update") - } - return nil, err - } - - if err := tx.Commit(); err != nil { return nil, err } diff --git a/pkg/database/queries/insight_products.sql b/pkg/database/queries/insight_products.sql index 057857a8..329b918c 100644 --- a/pkg/database/queries/insight_products.sql +++ b/pkg/database/queries/insight_products.sql @@ -9,7 +9,6 @@ INSERT INTO "keywords", "group", "teamkatalogen_url", - "product_area_id", "team_id" ) VALUES @@ -22,7 +21,6 @@ VALUES @keywords, @owner_group, @teamkatalogen_url, - @product_area_id, @team_id ) RETURNING *; @@ -58,7 +56,7 @@ SELECT FROM insight_product WHERE - product_area_id = @product_area_id + team_id = ANY(SELECT team_id FROM team_productarea_mapping WHERE product_area_id = @product_area_id) ORDER BY last_modified DESC; @@ -83,7 +81,6 @@ SET "link" = @link, "keywords" = @keywords, "teamkatalogen_url" = @teamkatalogen_url, - "product_area_id" = @product_area_id, "team_id" = @team_id WHERE id = @id RETURNING *; diff --git a/pkg/database/search.go b/pkg/database/search.go index f8d10d34..28ea00d9 100644 --- a/pkg/database/search.go +++ b/pkg/database/search.go @@ -74,6 +74,9 @@ func (r *Repo) Search(ctx context.Context, query *models.SearchQuery) ([]*models } qss, err := r.querier.GetQuartoStoriesByIDs(ctx, quartoStories) + if err != nil { + return nil, err + } ret := []*models.SearchResultRow{} for _, d := range dps { @@ -102,7 +105,7 @@ func (r *Repo) Search(ctx context.Context, query *models.SearchQuery) ([]*models for _, qs := range qss { ret = append(ret, &models.SearchResultRow{ Excerpt: excerpts[qs.ID], - Result: quartoSQLToGraphql(&qs), + Result: quartoSQLToGraphql(&qs), }) } diff --git a/pkg/database/story.go b/pkg/database/story.go index f2131bec..a2e478e3 100644 --- a/pkg/database/story.go +++ b/pkg/database/story.go @@ -106,10 +106,6 @@ func (r *Repo) PublishStory(ctx context.Context, ds models.NewStory) (*models.DB return nil, err } - if err := r.CreateTeamProductAreaMappingIfNotExists(ctx, tx, ds.TeamID, ds.ProductAreaID); err != nil { - return nil, err - } - for _, view := range draftViews { _, err := querier.CreateStoryView(ctx, gensql.CreateStoryViewParams{ StoryID: story.ID, @@ -214,13 +210,7 @@ func (r *Repo) UpdateStoryMetadata(ctx context.Context, id uuid.UUID, name strin return nil, err } - tx, err := r.db.Begin() - if err != nil { - return nil, err - } - querier := r.querier.WithTx(tx) - - updated, err := querier.UpdateStory(ctx, gensql.UpdateStoryParams{ + updated, err := r.querier.UpdateStory(ctx, gensql.UpdateStoryParams{ Name: name, Grp: story.Group, Description: sql.NullString{String: "", Valid: false}, @@ -230,17 +220,6 @@ func (r *Repo) UpdateStoryMetadata(ctx context.Context, id uuid.UUID, name strin TeamID: ptrToNullString(teamID), }) if err != nil { - if err := tx.Rollback(); err != nil { - r.log.WithError(err).Error("rolling back story metadata update") - } - return nil, err - } - - if err := r.CreateTeamProductAreaMappingIfNotExists(ctx, tx, teamID, productAreaID); err != nil { - return nil, err - } - - if err := tx.Commit(); err != nil { return nil, err } diff --git a/pkg/graph/generated/generated.go b/pkg/graph/generated/generated.go index 56a09ffc..c5309cea 100644 --- a/pkg/graph/generated/generated.go +++ b/pkg/graph/generated/generated.go @@ -45,6 +45,7 @@ type ResolverRoot interface { BigQuery() BigQueryResolver Dataproduct() DataproductResolver Dataset() DatasetResolver + InsightProduct() InsightProductResolver Mutation() MutationResolver Owner() OwnerResolver ProductArea() ProductAreaResolver @@ -447,6 +448,9 @@ type DatasetResolver interface { Services(ctx context.Context, obj *models.Dataset) (*models.DatasetServices, error) Mappings(ctx context.Context, obj *models.Dataset) ([]models.MappingService, error) } +type InsightProductResolver interface { + ProductAreaID(ctx context.Context, obj *models.InsightProduct) (*string, error) +} type MutationResolver interface { Dummy(ctx context.Context, no *string) (*string, error) GrantAccessToDataset(ctx context.Context, input models.NewGrant) (*models.Access, error) @@ -9341,7 +9345,7 @@ func (ec *executionContext) _InsightProduct_productAreaID(ctx context.Context, f }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { ctx = rctx // use context from middleware stack in children - return obj.ProductAreaID, nil + return ec.resolvers.InsightProduct().ProductAreaID(rctx, obj) }) if err != nil { ec.Error(ctx, err) @@ -9359,8 +9363,8 @@ func (ec *executionContext) fieldContext_InsightProduct_productAreaID(ctx contex fc = &graphql.FieldContext{ Object: "InsightProduct", Field: field, - IsMethod: false, - IsResolver: false, + IsMethod: true, + IsResolver: true, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { return nil, errors.New("field of type String does not have child fields") }, @@ -23153,53 +23157,84 @@ func (ec *executionContext) _InsightProduct(ctx context.Context, sel ast.Selecti case "id": out.Values[i] = ec._InsightProduct_id(ctx, field, obj) if out.Values[i] == graphql.Null { - out.Invalids++ + atomic.AddUint32(&out.Invalids, 1) } case "name": out.Values[i] = ec._InsightProduct_name(ctx, field, obj) if out.Values[i] == graphql.Null { - out.Invalids++ + atomic.AddUint32(&out.Invalids, 1) } case "creator": out.Values[i] = ec._InsightProduct_creator(ctx, field, obj) if out.Values[i] == graphql.Null { - out.Invalids++ + atomic.AddUint32(&out.Invalids, 1) } case "description": out.Values[i] = ec._InsightProduct_description(ctx, field, obj) if out.Values[i] == graphql.Null { - out.Invalids++ + atomic.AddUint32(&out.Invalids, 1) } case "type": out.Values[i] = ec._InsightProduct_type(ctx, field, obj) if out.Values[i] == graphql.Null { - out.Invalids++ + atomic.AddUint32(&out.Invalids, 1) } case "link": out.Values[i] = ec._InsightProduct_link(ctx, field, obj) if out.Values[i] == graphql.Null { - out.Invalids++ + atomic.AddUint32(&out.Invalids, 1) } case "keywords": out.Values[i] = ec._InsightProduct_keywords(ctx, field, obj) if out.Values[i] == graphql.Null { - out.Invalids++ + atomic.AddUint32(&out.Invalids, 1) } case "group": out.Values[i] = ec._InsightProduct_group(ctx, field, obj) if out.Values[i] == graphql.Null { - out.Invalids++ + atomic.AddUint32(&out.Invalids, 1) } case "teamkatalogenURL": out.Values[i] = ec._InsightProduct_teamkatalogenURL(ctx, field, obj) case "productAreaID": - out.Values[i] = ec._InsightProduct_productAreaID(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._InsightProduct_productAreaID(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) }) case "teamID": out.Values[i] = ec._InsightProduct_teamID(ctx, field, obj) case "created": out.Values[i] = ec._InsightProduct_created(ctx, field, obj) if out.Values[i] == graphql.Null { - out.Invalids++ + atomic.AddUint32(&out.Invalids, 1) } case "lastModified": out.Values[i] = ec._InsightProduct_lastModified(ctx, field, obj) diff --git a/pkg/graph/group.resolvers.go b/pkg/graph/group.resolvers.go index 7c9188e6..374fb756 100644 --- a/pkg/graph/group.resolvers.go +++ b/pkg/graph/group.resolvers.go @@ -13,13 +13,12 @@ import ( // ProductAreaID is the resolver for the productAreaID field. func (r *ownerResolver) ProductAreaID(ctx context.Context, obj *models.Owner) (*string, error) { - if obj.TeamID != nil { - teamPAMapping, err := r.repo.GetTeamAndProductAreaID(ctx, *obj.TeamID) + if teamID := ptrToString(obj.TeamID); teamID != "" { + team, err := r.teamkatalogen.GetTeam(ctx, teamID) if err != nil { return nil, err } - - return &teamPAMapping.ProductAreaID.String, nil + return &team.ProductAreaID, nil } return nil, nil diff --git a/pkg/graph/insight_product.resolvers.go b/pkg/graph/insight_product.resolvers.go index 9d2cc4e2..ab97aae7 100644 --- a/pkg/graph/insight_product.resolvers.go +++ b/pkg/graph/insight_product.resolvers.go @@ -9,9 +9,23 @@ import ( "github.com/google/uuid" "github.com/navikt/nada-backend/pkg/auth" + "github.com/navikt/nada-backend/pkg/graph/generated" "github.com/navikt/nada-backend/pkg/graph/models" ) +// ProductAreaID is the resolver for the productAreaID field. +func (r *insightProductResolver) ProductAreaID(ctx context.Context, obj *models.InsightProduct) (*string, error) { + if teamID := ptrToString(obj.TeamID); teamID != "" { + team, err := r.teamkatalogen.GetTeam(ctx, teamID) + if err != nil { + return nil, err + } + return &team.ProductAreaID, nil + } + + return nil, nil +} + // CreateInsightProduct is the resolver for the createInsightProduct field. func (r *mutationResolver) CreateInsightProduct(ctx context.Context, input models.NewInsightProduct) (*models.InsightProduct, error) { return r.repo.CreateInsightProduct(ctx, auth.GetUser(ctx).Email, input) @@ -66,3 +80,10 @@ func (r *mutationResolver) DeleteInsightProduct(ctx context.Context, id uuid.UUI func (r *queryResolver) InsightProduct(ctx context.Context, id uuid.UUID) (*models.InsightProduct, error) { return r.repo.GetInsightProduct(ctx, id) } + +// InsightProduct returns generated.InsightProductResolver implementation. +func (r *Resolver) InsightProduct() generated.InsightProductResolver { + return &insightProductResolver{r} +} + +type insightProductResolver struct{ *Resolver } diff --git a/pkg/graph/models/insight_product.go b/pkg/graph/models/insight_product.go index b0b8874c..4c6810ca 100644 --- a/pkg/graph/models/insight_product.go +++ b/pkg/graph/models/insight_product.go @@ -26,8 +26,6 @@ type InsightProduct struct { Group string `json:"group"` // teamkatalogenURL of the creator TeamkatalogenURL *string `json:"teamkatalogenURL,omitempty"` - // Id of the creator's product area. - ProductAreaID *string `json:"productAreaID,omitempty"` // Id of the creator's team. TeamID *string `json:"teamID,omitempty"` // created is the timestamp for when the insight product was created diff --git a/pkg/graph/productAreas.resolvers.go b/pkg/graph/productAreas.resolvers.go index 7ec8de79..9e0c31c6 100644 --- a/pkg/graph/productAreas.resolvers.go +++ b/pkg/graph/productAreas.resolvers.go @@ -133,7 +133,5 @@ func (r *Resolver) ProductArea() generated.ProductAreaResolver { return &product // Team returns generated.TeamResolver implementation. func (r *Resolver) Team() generated.TeamResolver { return &teamResolver{r} } -type ( - productAreaResolver struct{ *Resolver } - teamResolver struct{ *Resolver } -) +type productAreaResolver struct{ *Resolver } +type teamResolver struct{ *Resolver } diff --git a/pkg/graph/quarto_story.resolvers.go b/pkg/graph/quarto_story.resolvers.go index b4f46030..c5aa9d8e 100644 --- a/pkg/graph/quarto_story.resolvers.go +++ b/pkg/graph/quarto_story.resolvers.go @@ -77,12 +77,12 @@ func (r *mutationResolver) DeleteQuartoStory(ctx context.Context, id uuid.UUID) // ProductAreaID is the resolver for the productAreaID field. func (r *quartoStoryResolver) ProductAreaID(ctx context.Context, obj *models.QuartoStory) (*string, error) { - if obj.TeamID != nil { - teamPAMapping, err := r.repo.GetTeamAndProductAreaID(ctx, *obj.TeamID) + if teamID := ptrToString(obj.TeamID); teamID != "" { + team, err := r.teamkatalogen.GetTeam(ctx, teamID) if err != nil { return nil, err } - return &teamPAMapping.ProductAreaID.String, nil + return &team.ProductAreaID, nil } return nil, nil diff --git a/pkg/httpwithcache/httpclient.go b/pkg/httpwithcache/httpclient.go index 5b3ee1f1..085f7077 100644 --- a/pkg/httpwithcache/httpclient.go +++ b/pkg/httpwithcache/httpclient.go @@ -51,7 +51,6 @@ func isValidResponse(response []byte) bool { func updateCache(client *http.Client, req *http.Request) ([]byte, error) { endpoint := req.URL.String() - log.Printf("Update cache for %v", endpoint) _, err := cacheDB.Exec(`INSERT INTO http_cache (endpoint, response_body, created_at, last_tried_update_at) VALUES ($1, $2, $3, $3) ON CONFLICT (endpoint) DO UPDATE SET last_tried_update_at = $3`, endpoint, "", time.Now().UTC()) if err != nil { diff --git a/pkg/productareaupdater/productareaupdater.go b/pkg/productareaupdater/productareaupdater.go deleted file mode 100644 index 68f4cf71..00000000 --- a/pkg/productareaupdater/productareaupdater.go +++ /dev/null @@ -1,58 +0,0 @@ -package productareaupdater - -import ( - "context" - "time" - - "github.com/navikt/nada-backend/pkg/database" - "github.com/navikt/nada-backend/pkg/graph" - "github.com/sirupsen/logrus" -) - -type ProductAreaUpdater struct { - repo *database.Repo - teamcatalogClient graph.Teamkatalogen - log *logrus.Entry -} - -func New(repo *database.Repo, teamcatalogClient graph.Teamkatalogen, log *logrus.Entry) *ProductAreaUpdater { - return &ProductAreaUpdater{ - repo: repo, - teamcatalogClient: teamcatalogClient, - log: log, - } -} - -func (p *ProductAreaUpdater) Run(ctx context.Context, frequency time.Duration) { - ticker := time.NewTicker(frequency) - defer ticker.Stop() - for { - p.run(ctx) - select { - case <-ctx.Done(): - return - case <-ticker.C: - } - } -} - -func (p *ProductAreaUpdater) run(ctx context.Context) { - teamPAMappings, err := p.repo.GetTeamsAndProductAreaIDs(ctx) - if err != nil { - p.log.WithError(err).Error("fetching team and product area mappings") - return - } - - for _, teamPAMapping := range teamPAMappings { - team, err := p.teamcatalogClient.GetTeam(ctx, teamPAMapping.TeamID) - if err != nil { - p.log.WithError(err).Errorf("reading team %v from teamkatalogen", teamPAMapping.TeamID) - continue - } - if !teamPAMapping.ProductAreaID.Valid || teamPAMapping.ProductAreaID.String != team.ProductAreaID { - if err := p.repo.UpdateProductAreaForTeam(ctx, team.ID, team.ProductAreaID); err != nil { - p.log.WithError(err).Errorf("updating product area id from %v to %v for team %v", teamPAMapping.ProductAreaID, team.ProductAreaID, team.ID) - } - } - } -}