> ## Documentation Index
> Fetch the complete documentation index at: https://docs.sensorup.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Assets Subgraph Reference

> Technical reference for the su-assets subgraph schema, types, queries, and mutations.

# Assets Subgraph Reference

The `su-assets` subgraph provides comprehensive asset management capabilities including asset profiles, properties, relationships, and views.

## Subgraph Information

* **Name**: `su-assets`
* **Routing URL**: `https://73qfchk50k.execute-api.us-west-2.amazonaws.com/poc/graphql`
* **Last Updated**: 2025-10-09
* **SDL**: [View Schema](../schemas/sdl/su-assets.graphql)

## Overview

This subgraph owns:

* Asset profiles and their configuration
* Individual assets and their properties
* Asset relationships and hierarchies
* View configurations for UI rendering
* Asset filters for workflow integration
* Asset conversion configurations

## Root Types

### Query Fields

```graphql theme={null}
extend type Query {
  assetProfiles: AssetProfiles
  assets(profile: ID!): Assets
  assetFilters: [AssetSelectionFilter!]
  assetFilter(id: ID!): AssetSelectionFilter
  assetFilterDownloads: [AssetDownload!]
}
```

### Mutation Fields

```graphql theme={null}
extend type Mutation {
  updateAssetProfile(input: UpdateAssetProfileInput): AssetProfileMutationResult
  putAssetProfileExtension(input: putAssetProfileExtensionInput!): AssetProfileMutationResult
  removeAssetProfileExtension(input: removeAssetProfileExtensionInput!): AssetProfileMutationResult
  updateAssetProfileViewConfiguration(input: UpdateAssetProfileViewConfigurationInput!): AssetProfileViewConfigurationMutationResult!
  updateAssetProfileViewLayout(input: UpdateAssetProfileViewLayoutInput): AssetProfileViewLayoutMutationResult!
  updateAssetProfileAssetConversionConfiguration(input: UpdateAssetProfileAssetConversionConfigurationInput!): AssetProfileAssetConversionConfigurationMutationResult!
  createAssetFilter(input: CreateAssetFilterInput!, correlationId: String): AssetFilterMutationResult
  updateAssetFilter(input: UpdateAssetFilterInput!, correlationId: String): AssetFilterMutationResult
}
```

## Core Types

### AssetProfile

Defines the structure and behavior of a class of assets.

```graphql theme={null}
type AssetProfile @key(fields: "profile") {
  profile: ID!
  title: String!
  owner: EntityOwner!
  properties: [AssetPropertyDefinition!]
  propertyMaps: [AssetProfilePropertyMapping!]
  displayNameProperty: String!
  displayNameTemplate: String
  secondaryDisplayNameProperty: String
  isDeletedProperty: String
  forceAssetStateUpdates: Boolean
  relationships: [AssetProfileRelationship!]
  assets(first: Int, after: String, filter: AssetFilter): AssetsConnection
  assetsExport(...): AssetProfileAssetExport
  assetById(id: ID!): Asset
  upDatasets: [UpDataset!]
  upDataset(dataset: String!): UpDataset
  viewConfigurations: [AssetProfileViewConfiguration!]
  viewConfiguration(id: ID!): AssetProfileViewConfiguration
  assetConversionConfigurations: [AssetProfileAssetConversionConfiguration!]
  stateUpdateDatasets: [StateUpdateDataset!]
}
```

**Key Fields:**

* `profile`: Unique identifier for this asset profile type
* `title`: Human-readable name
* `displayNameProperty`: Property used for asset display name
* `properties`: Effective properties available on assets
* `relationships`: Defined relationships to other asset profiles

### Asset

Individual asset instance.

```graphql theme={null}
type Asset @key(fields: "profile id") {
  id: ID!
  profile: ID!
  assetProfile: AssetProfile
  modifiedAt: DateTime
  geometry: GeoJSONGeometryInterface
  properties(only: [String!]): JSONObject
  observation: JSONObject
  geoJSONFeature: GeoJSONFeature
  displayName: String!
  secondaryDisplayName: String
  related(relationship: ID, params: JSONObject): AssetRelationship
  issueSubject: IssueSubject!
  isDeleted: Boolean!
}
```

**Key Fields:**

* `id`: Unique asset identifier within profile
* `profile`: Reference to asset profile
* `displayName`: Computed display name from profile configuration
* `properties`: Dynamic properties from underlying datasets
* `observation`: Merged state observation
* `geometry`: GeoJSON geometry if geospatial
* `related`: Navigate relationships to other assets

### AssetRelationship

Union type for one-to-one or one-to-many relationships.

```graphql theme={null}
union AssetRelationship = AssetRelationshipOne | AssetRelationshipMany

type AssetRelationshipOne {
  asset: Asset
  observation: JSONObject
}

type AssetRelationshipMany {
  assets: [Asset!]
  observations: [JSONObject!]
}
```

### AssetProfileRelationship

Defines a relationship between asset profiles.

```graphql theme={null}
type AssetProfileRelationship {
  relationship: ID!
  type: AssetProfileRelationshipType!  # ONE or MANY
  profile: ID!
  assetProfile: AssetProfile!
  referenceProperty: String
  referenceType: AssetProfileRelationshipReferenceType!
  lookupProperty: String
  lookupType: AssetProfileRelationshipReferenceType!
  parameters: [UpSpecificationParameter!]
}
```

## Pagination

Uses Relay-style cursor pagination:

```graphql theme={null}
type AssetsConnection {
  pageInfo: PageInfo!
  edges: [AssetEdge]
}

type AssetEdge {
  node: Asset
}
```

## View Configurations

UI layout and visualization settings:

```graphql theme={null}
type AssetProfileViewConfiguration {
  id: ID!
  name: String
  map: AssetProfileViewMap
  layouts(mediaTypes: [AssetProfileViewLayoutMediaType!]): [AssetProfileViewLayout!]
}

type AssetProfileViewLayout {
  mediaType: AssetProfileViewLayoutMediaType  # WEB, MOBILE, PRINTABLE
  widgets: [AssetProfileViewWidget!]
}

type AssetProfileViewWidget {
  id: ID!
  layout: AssetProfileViewLayoutDetails!  # x, y, w, h
  name: String!
  settings: JSONObject!
  widget: String!
}
```

## Asset Filters

Reusable asset selections for workflows:

```graphql theme={null}
type AssetSelectionFilter @key(fields: "id") {
  id: ID!
  displayName: String!
  description: String
  profile: ID!
  assetProfile: AssetProfile!
  subProfiles: [AssetSelectionFilterRelationship!]
  audit: AssetSelectionFilterAudit
}
```

## Entity Extensions

This subgraph extends entities from other subgraphs:

### EntityOwner

```graphql theme={null}
type EntityOwner
  @extends
  @key(fields: "username group") {
  username: String! @external
  group: String! @external
}
```

### IssueSubject

```graphql theme={null}
type IssueSubject
  @extends
  @key(fields: "type reference") {
  type: String! @external
  reference: ID! @external
  assetReference: AssetReference @requires(fields: "type reference")
}
```

## Common Patterns

### Query Assets with Pagination

```graphql theme={null}
query GetAssets($profile: ID!, $first: Int!, $after: String) {
  assetProfiles {
    byId(profile: $profile) {
      assets(first: $first, after: $after) {
        edges {
          node {
            id
            displayName
            modifiedAt
          }
        }
        pageInfo {
          hasNextPage
          endCursor
        }
      }
    }
  }
}
```

### Update Asset Profile

```graphql theme={null}
mutation UpdateProfile($input: UpdateAssetProfileInput!) {
  updateAssetProfile(input: $input) {
    assetProfile {
      profile
      displayNameTemplate
    }
    correlationId
    errors {
      message
      type
    }
  }
}
```

### Export Assets

```graphql theme={null}
query ExportAssets($profile: ID!) {
  assetProfiles {
    byId(profile: $profile) {
      assetsExport(
        properties: ["name", "status"],
        isExcel: false
      ) {
        csvFileDownloadUrl(exportName: "assets")
      }
    }
  }
}
```

## Related Resources

* **[CAM Assets Subgraph](./cam-assets)** - Camera-specific assets
* **[Full SDL Schema](../schemas/sdl/su-assets.graphql)** - Complete type definitions

## Type Index

Key types defined in this subgraph:

* `AssetProfile` - Profile definitions
* `Asset` - Individual assets
* `AssetPropertyDefinition` - Property schemas
* `AssetRelationship` - Relationship data
* `AssetProfileViewConfiguration` - UI configurations
* `AssetSelectionFilter` - Reusable filters
* `PageInfo` - Pagination metadata (@shareable)
* GeoJSON types (@shareable)
