From cf1c5f2186234021815942f36a685edd3b146cc0 Mon Sep 17 00:00:00 2001 From: mr Date: Wed, 15 Jan 2025 11:01:13 +0100 Subject: [PATCH] light modification --- models/workflow/graph/item.go | 30 +++++++++++++++++++++++ models/workflow/graph/link.go | 45 +++++++++++++++++++++++++++++++++++ 2 files changed, 75 insertions(+) create mode 100644 models/workflow/graph/item.go create mode 100644 models/workflow/graph/link.go diff --git a/models/workflow/graph/item.go b/models/workflow/graph/item.go new file mode 100644 index 0000000..7519f23 --- /dev/null +++ b/models/workflow/graph/item.go @@ -0,0 +1,30 @@ +package graph + +import ( + "cloud.o-forge.io/core/oc-lib/models/resources" + "cloud.o-forge.io/core/oc-lib/tools" +) + +// GraphItem is a struct that represents an item in a graph +type GraphItem struct { + ID string `bson:"id" json:"id" validate:"required"` // ID is the unique identifier of the item + Width float64 `bson:"width" json:"width" validate:"required"` // Width is the graphical width of the item + Height float64 `bson:"height" json:"height" validate:"required"` // Height is the graphical height of the item + Position Position `bson:"position" json:"position" validate:"required"` // Position is the graphical position of the item + *resources.ItemResource // ItemResource is the resource of the item affected to the item +} + +func (g *GraphItem) GetResource() (tools.DataType, resources.ResourceInterface) { + if g.Data != nil { + return tools.DATA_RESOURCE, g.Data + } else if g.Compute != nil { + return tools.COMPUTE_RESOURCE, g.Compute + } else if g.Workflow != nil { + return tools.WORKFLOW_RESOURCE, g.Workflow + } else if g.Processing != nil { + return tools.PROCESSING_RESOURCE, g.Processing + } else if g.Storage != nil { + return tools.STORAGE_RESOURCE, g.Storage + } + return tools.INVALID, nil +} diff --git a/models/workflow/graph/link.go b/models/workflow/graph/link.go new file mode 100644 index 0000000..a6acc27 --- /dev/null +++ b/models/workflow/graph/link.go @@ -0,0 +1,45 @@ +package graph + +// GraphLink is a struct that represents a link between two items in a graph +type GraphLink struct { + Source Position `bson:"source" json:"source" validate:"required"` // Source is the source graphical position of the link + Destination Position `bson:"destination" json:"destination" validate:"required"` // Destination is the destination graphical position of the link + Style *GraphLinkStyle `bson:"style,omitempty" json:"style,omitempty"` // Style is the graphical style of the link +} + +// tool function to check if a link is a link between a compute and a resource +func (l *GraphLink) IsComputeLink(g Graph) (bool, string) { + if g.Items == nil { + return false, "" + } + if d, ok := g.Items[l.Source.ID]; ok && d.Compute != nil { + return true, d.Compute.UUID + } + if d, ok := g.Items[l.Destination.ID]; ok && d.Compute != nil { + return true, d.Compute.UUID + } + return false, "" +} + +// GraphLinkStyle is a struct that represents the style of a link in a graph +type GraphLinkStyle struct { + Color int64 `bson:"color" json:"color"` // Color is the graphical color of the link (int description of a color, can be transpose as hex) + Stroke float64 `bson:"stroke" json:"stroke"` // Stroke is the graphical stroke of the link + Tension float64 `bson:"tension" json:"tension"` // Tension is the graphical tension of the link + HeadRadius float64 `bson:"head_radius" json:"head_radius"` // graphical pin radius + DashWidth float64 `bson:"dash_width" json:"dash_width"` // DashWidth is the graphical dash width of the link + DashSpace float64 `bson:"dash_space" json:"dash_space"` // DashSpace is the graphical dash space of the link + EndArrow Position `bson:"end_arrow" json:"end_arrow"` // EndArrow is the graphical end arrow of the link + StartArrow Position `bson:"start_arrow" json:"start_arrow"` // StartArrow is the graphical start arrow of the link + ArrowStyle int64 `bson:"arrow_style" json:"arrow_style"` // ArrowStyle is the graphical arrow style of the link (enum foundable in UI) + ArrowDirection int64 `bson:"arrow_direction" json:"arrow_direction"` // ArrowDirection is the graphical arrow direction of the link (enum foundable in UI) + StartArrowWidth float64 `bson:"start_arrow_width" json:"start_arrow_width"` // StartArrowWidth is the graphical start arrow width of the link + EndArrowWidth float64 `bson:"end_arrow_width" json:"end_arrow_width"` // EndArrowWidth is the graphical end arrow width of the link +} + +// Position is a struct that represents a graphical position +type Position struct { + ID string `json:"id" bson:"id"` // ID reprents ItemID (optionnal) + X float64 `json:"x" bson:"x" validate:"required"` // X is the graphical x position + Y float64 `json:"y" bson:"y" validate:"required"` // Y is the graphical y position +}