func createOrUpdateWorkItemLinkType(ctx context.Context, linkCatRepo *link.GormWorkItemLinkCategoryRepository, linkTypeRepo *link.GormWorkItemLinkTypeRepository, name, description, topology, forwardName, reverseName, sourceTypeName, targetTypeName, linkCatName string) error { cat, err := linkCatRepo.LoadCategoryFromDB(ctx, linkCatName) if err != nil { return errs.WithStack(err) } linkType, err := linkTypeRepo.LoadTypeFromDBByNameAndCategory(ctx, name, cat.ID) lt := link.WorkItemLinkType{ Name: name, Description: &description, Topology: topology, ForwardName: forwardName, ReverseName: reverseName, SourceTypeName: sourceTypeName, TargetTypeName: targetTypeName, LinkCategoryID: cat.ID, } cause := errs.Cause(err) switch cause.(type) { case errors.NotFoundError: _, err := linkTypeRepo.Create(ctx, lt.Name, lt.Description, lt.SourceTypeName, lt.TargetTypeName, lt.ForwardName, lt.ReverseName, lt.Topology, lt.LinkCategoryID) if err != nil { return errs.WithStack(err) } case nil: log.Info(ctx, map[string]interface{}{ "pkg": "migration", "wilt": name, }, "Work item link type %s exists, will update/overwrite all fields", name) lt.ID = linkType.ID lt.Version = linkType.Version _, err = linkTypeRepo.Save(ctx, link.ConvertLinkTypeFromModel(lt)) return errs.WithStack(err) } return nil }