Implement Business Logic using Pipeline

Pipeline service enables complex data retrieval and transformation by chaining multiple queries and data processing steps.

Let's create a pipeline to get the project's details and the status of its associated tasks.

Tutorial steps

  1. Create getProjectStatus Pipeline Resolver
  2. Include the Resolver in the pipeline.cue File
  3. Apply the change using tailorctl
  4. Review and Test the Created Pipeline Resolver

1. Create getProjectStatus Pipeline Resolver

Add the file getProjectStatus.cue in the resolvers folder located in the services/pipeline folder.

<span><span style="color: var(--shiki-token-keyword)">package</span><span style="color: var(--shiki-color-text)"> resolvers</span></span>
<span></span>
<span><span style="color: var(--shiki-token-keyword)">import</span><span style="color: var(--shiki-color-text)"> (</span></span>
<span><span style="color: var(--shiki-color-text)">	</span><span style="color: var(--shiki-color-text)">&quot;</span><span style="color: var(--shiki-token-string-expression)">github.com/tailor-platform/tailorctl/schema/v2/pipeline</span><span style="color: var(--shiki-color-text)">&quot;</span></span>
<span><span style="color: var(--shiki-color-text)">	</span><span style="color: var(--shiki-color-text)">&quot;</span><span style="color: var(--shiki-token-string-expression)">tailor.build/template/services/pipeline</span><span style="color: var(--shiki-color-text)">:settings</span><span style="color: var(--shiki-color-text)">&quot;</span></span>
<span><span style="color: var(--shiki-color-text)">)</span></span>
<span></span>
<span><span style="color: var(--shiki-color-text)">tasksResult: {</span></span>
<span><span style="color: var(--shiki-color-text)">	Name: </span><span style="color: var(--shiki-color-text)">&quot;</span><span style="color: var(--shiki-token-string-expression)">tasksResult</span><span style="color: var(--shiki-color-text)">&quot;</span></span>
<span><span style="color: var(--shiki-color-text)">	Fields: [</span></span>
<span><span style="color: var(--shiki-color-text)">		{Name: </span><span style="color: var(--shiki-color-text)">&quot;</span><span style="color: var(--shiki-token-string-expression)">projectId</span><span style="color: var(--shiki-color-text)">&quot;</span><span style="color: var(--shiki-token-punctuation)">,</span><span style="color: var(--shiki-color-text)"> Type: pipeline.ID</span><span style="color: var(--shiki-token-punctuation)">,</span><span style="color: var(--shiki-color-text)"> Required: </span><span style="color: var(--shiki-token-constant)">true</span><span style="color: var(--shiki-color-text)">}</span><span style="color: var(--shiki-token-punctuation)">,</span></span>
<span><span style="color: var(--shiki-color-text)">		{Name: </span><span style="color: var(--shiki-color-text)">&quot;</span><span style="color: var(--shiki-token-string-expression)">projectName</span><span style="color: var(--shiki-color-text)">&quot;</span><span style="color: var(--shiki-token-punctuation)">,</span><span style="color: var(--shiki-color-text)"> Type: pipeline.String }</span><span style="color: var(--shiki-token-punctuation)">,</span></span>
<span><span style="color: var(--shiki-color-text)">    {Name: </span><span style="color: var(--shiki-color-text)">&quot;</span><span style="color: var(--shiki-token-string-expression)">status</span><span style="color: var(--shiki-color-text)">&quot;</span><span style="color: var(--shiki-token-punctuation)">,</span><span style="color: var(--shiki-color-text)"> Type: pipeline.String }</span><span style="color: var(--shiki-token-punctuation)">,</span></span>
<span><span style="color: var(--shiki-color-text)">		{</span></span>
<span><span style="color: var(--shiki-color-text)">			Name: </span><span style="color: var(--shiki-color-text)">&quot;</span><span style="color: var(--shiki-token-string-expression)">result</span><span style="color: var(--shiki-color-text)">&quot;</span></span>
<span><span style="color: var(--shiki-color-text)">			Array: </span><span style="color: var(--shiki-token-constant)">true</span></span>
<span><span style="color: var(--shiki-color-text)">			Type: {</span></span>
<span><span style="color: var(--shiki-color-text)">				Name: </span><span style="color: var(--shiki-color-text)">&quot;</span><span style="color: var(--shiki-token-string-expression)">taskItemResult</span><span style="color: var(--shiki-color-text)">&quot;</span></span>
<span><span style="color: var(--shiki-color-text)">				Fields: [</span></span>
<span><span style="color: var(--shiki-color-text)">					{Name: </span><span style="color: var(--shiki-color-text)">&quot;</span><span style="color: var(--shiki-token-string-expression)">id</span><span style="color: var(--shiki-color-text)">&quot;</span><span style="color: var(--shiki-token-punctuation)">,</span><span style="color: var(--shiki-color-text)"> Type: pipeline.ID}</span><span style="color: var(--shiki-token-punctuation)">,</span></span>
<span><span style="color: var(--shiki-color-text)">					{Name: </span><span style="color: var(--shiki-color-text)">&quot;</span><span style="color: var(--shiki-token-string-expression)">name</span><span style="color: var(--shiki-color-text)">&quot;</span><span style="color: var(--shiki-token-punctuation)">,</span><span style="color: var(--shiki-color-text)"> Type: pipeline.String}</span><span style="color: var(--shiki-token-punctuation)">,</span></span>
<span><span style="color: var(--shiki-color-text)">					{Name: </span><span style="color: var(--shiki-color-text)">&quot;</span><span style="color: var(--shiki-token-string-expression)">projectId</span><span style="color: var(--shiki-color-text)">&quot;</span><span style="color: var(--shiki-token-punctuation)">,</span><span style="color: var(--shiki-color-text)"> Type: pipeline.ID}</span><span style="color: var(--shiki-token-punctuation)">,</span></span>
<span><span style="color: var(--shiki-color-text)">					{Name: </span><span style="color: var(--shiki-color-text)">&quot;</span><span style="color: var(--shiki-token-string-expression)">dueDate</span><span style="color: var(--shiki-color-text)">&quot;</span><span style="color: var(--shiki-token-punctuation)">,</span><span style="color: var(--shiki-color-text)"> Type: pipeline.DateTime}</span><span style="color: var(--shiki-token-punctuation)">,</span></span>
<span><span style="color: var(--shiki-color-text)">					{Name: </span><span style="color: var(--shiki-color-text)">&quot;</span><span style="color: var(--shiki-token-string-expression)">status</span><span style="color: var(--shiki-color-text)">&quot;</span><span style="color: var(--shiki-token-punctuation)">,</span><span style="color: var(--shiki-color-text)"> Type: pipeline.String}</span><span style="color: var(--shiki-token-punctuation)">,</span></span>
<span><span style="color: var(--shiki-color-text)">				]</span></span>
<span><span style="color: var(--shiki-color-text)">			}</span></span>
<span><span style="color: var(--shiki-color-text)">		}</span><span style="color: var(--shiki-token-punctuation)">,</span></span>
<span><span style="color: var(--shiki-color-text)">	]</span></span>
<span><span style="color: var(--shiki-color-text)">}</span></span>
<span></span>
<span><span style="color: var(--shiki-color-text)">getProjectStatus: pipeline.#Resolver </span><span style="color: var(--shiki-token-keyword)">&amp;</span><span style="color: var(--shiki-color-text)"> {</span></span>
<span><span style="color: var(--shiki-color-text)">	Authorization: pipeline.#AuthInsecure</span></span>
<span><span style="color: var(--shiki-color-text)">	Name:        </span><span style="color: var(--shiki-color-text)">&quot;</span><span style="color: var(--shiki-token-string-expression)">getProjectStatus</span><span style="color: var(--shiki-color-text)">&quot;</span></span>
<span><span style="color: var(--shiki-color-text)">	Description: </span><span style="color: var(--shiki-color-text)">&quot;</span><span style="color: var(--shiki-token-string-expression)">List all the tasks for a project</span><span style="color: var(--shiki-color-text)">&quot;</span></span>
<span><span style="color: var(--shiki-color-text)">	Response: {Type: tasksResult}</span></span>
<span><span style="color: var(--shiki-color-text)">	Inputs: [</span></span>
<span><span style="color: var(--shiki-color-text)">		{</span></span>
<span><span style="color: var(--shiki-color-text)">			Name: </span><span style="color: var(--shiki-color-text)">&quot;</span><span style="color: var(--shiki-token-string-expression)">input</span><span style="color: var(--shiki-color-text)">&quot;</span></span>
<span><span style="color: var(--shiki-color-text)">			Required: </span><span style="color: var(--shiki-token-constant)">true</span></span>
<span><span style="color: var(--shiki-color-text)">			Type: {</span></span>
<span><span style="color: var(--shiki-color-text)">				Name: </span><span style="color: var(--shiki-color-text)">&quot;</span><span style="color: var(--shiki-token-string-expression)">ProjectStatusInput</span><span style="color: var(--shiki-color-text)">&quot;</span></span>
<span><span style="color: var(--shiki-color-text)">				Fields: [</span></span>
<span><span style="color: var(--shiki-color-text)">					{Name: </span><span style="color: var(--shiki-color-text)">&quot;</span><span style="color: var(--shiki-token-string-expression)">projectId</span><span style="color: var(--shiki-color-text)">&quot;</span><span style="color: var(--shiki-token-punctuation)">,</span><span style="color: var(--shiki-color-text)"> Type: pipeline.ID</span><span style="color: var(--shiki-token-punctuation)">,</span><span style="color: var(--shiki-color-text)"> Required: </span><span style="color: var(--shiki-token-constant)">true</span><span style="color: var(--shiki-color-text)">}</span><span style="color: var(--shiki-token-punctuation)">,</span></span>
<span><span style="color: var(--shiki-color-text)">				]</span></span>
<span><span style="color: var(--shiki-color-text)">			}</span></span>
<span><span style="color: var(--shiki-color-text)">		}</span><span style="color: var(--shiki-token-punctuation)">,</span></span>
<span><span style="color: var(--shiki-color-text)">	]</span></span>
<span><span style="color: var(--shiki-color-text)">	Pipelines: [</span></span>
<span><span style="color: var(--shiki-color-text)">		{</span></span>
<span><span style="color: var(--shiki-color-text)">			Name:        </span><span style="color: var(--shiki-color-text)">&quot;</span><span style="color: var(--shiki-token-string-expression)">getProjectInfo</span><span style="color: var(--shiki-color-text)">&quot;</span></span>
<span><span style="color: var(--shiki-color-text)">			Description: </span><span style="color: var(--shiki-color-text)">&quot;</span><span style="color: var(--shiki-token-string-expression)">Get project info</span><span style="color: var(--shiki-color-text)">&quot;</span></span>
<span><span style="color: var(--shiki-color-text)">			Invoker:     settings.adminInvoker</span></span>
<span><span style="color: var(--shiki-color-text)">			PreScript:   </span><span style="color: var(--shiki-color-text)">&quot;&quot;&quot;</span></span>
<span><span style="color: var(--shiki-token-string-expression)">			{</span></span>
<span><span style="color: var(--shiki-token-string-expression)">				&#39;projectId&#39;: context.args.input.projectId,</span></span>
<span><span style="color: var(--shiki-token-string-expression)">			}</span><span style="color: var(--shiki-color-text)">&quot;&quot;&quot;</span></span>
<span><span style="color: var(--shiki-color-text)">			Operation: pipeline.#GraphqlOperation </span><span style="color: var(--shiki-token-keyword)">&amp;</span><span style="color: var(--shiki-color-text)"> {</span></span>
<span><span style="color: var(--shiki-color-text)">                Query: </span><span style="color: var(--shiki-color-text)">&quot;&quot;&quot;</span></span>
<span><span style="color: var(--shiki-token-string-expression)">                   query fetchProjectInfo($projectId: ID!) {</span></span>
<span><span style="color: var(--shiki-token-string-expression)">                    project(id: $projectId) {</span></span>
<span><span style="color: var(--shiki-token-string-expression)">                      id</span></span>
<span><span style="color: var(--shiki-token-string-expression)">                      name</span></span>
<span><span style="color: var(--shiki-token-string-expression)">                      startDate</span></span>
<span><span style="color: var(--shiki-token-string-expression)">                      endDate</span></span>
<span><span style="color: var(--shiki-token-string-expression)">                      status</span></span>
<span><span style="color: var(--shiki-token-string-expression)">                    }</span></span>
<span><span style="color: var(--shiki-token-string-expression)">						        tasks(query: {projectId: {eq: $projectId}}) {</span></span>
<span><span style="color: var(--shiki-token-string-expression)">                      collection {</span></span>
<span><span style="color: var(--shiki-token-string-expression)">                        id</span></span>
<span><span style="color: var(--shiki-token-string-expression)">                        name</span></span>
<span><span style="color: var(--shiki-token-string-expression)">                        projectId</span></span>
<span><span style="color: var(--shiki-token-string-expression)">                        dueDate</span></span>
<span><span style="color: var(--shiki-token-string-expression)">                        status</span></span>
<span><span style="color: var(--shiki-token-string-expression)">                      }</span></span>
<span><span style="color: var(--shiki-token-string-expression)">                    }</span></span>
<span><span style="color: var(--shiki-token-string-expression)">                }</span><span style="color: var(--shiki-color-text)">&quot;&quot;&quot;</span></span>
<span><span style="color: var(--shiki-color-text)">            }</span></span>
<span><span style="color: var(--shiki-color-text)">			PostScript: </span><span style="color: var(--shiki-color-text)">&quot;&quot;&quot;</span></span>
<span><span style="color: var(--shiki-token-string-expression)">				{</span></span>
<span><span style="color: var(--shiki-token-string-expression)">				&quot;tasks&quot;: args.tasks,</span></span>
<span><span style="color: var(--shiki-token-string-expression)">				&quot;projectId&quot;:context.args.input.projectId,</span></span>
<span><span style="color: var(--shiki-token-string-expression)">				&quot;projectName&quot;: args.project.name,</span></span>
<span><span style="color: var(--shiki-token-string-expression)">				&quot;result&quot;: size(args.tasks.collection)== 0 ? [] : args.tasks.collection.map(e, {</span></span>
<span><span style="color: var(--shiki-token-string-expression)">					&quot;id&quot;: e.id,</span></span>
<span><span style="color: var(--shiki-token-string-expression)">					&quot;name&quot;: e.name,</span></span>
<span><span style="color: var(--shiki-token-string-expression)">					&quot;projectId&quot;: e.projectId,</span></span>
<span><span style="color: var(--shiki-token-string-expression)">					&quot;dueDate&quot;: e.dueDate,</span></span>
<span><span style="color: var(--shiki-token-string-expression)">					&quot;status&quot;: e.status</span></span>
<span><span style="color: var(--shiki-token-string-expression)">				})</span></span>
<span><span style="color: var(--shiki-token-string-expression)">			}</span><span style="color: var(--shiki-color-text)">&quot;&quot;&quot;</span></span>
<span><span style="color: var(--shiki-color-text)">		}</span><span style="color: var(--shiki-token-punctuation)">,</span></span>
<span><span style="color: var(--shiki-color-text)">	]</span></span>
<span><span style="color: var(--shiki-color-text)">}</span></span>
<span></span>

The Inputs is an array of the input types and Response is the output type of the pipeline resolver.

In this example, the getProjectStatus pipeline resolver accepts an input of type ProjectStatusInput and returns a response of type tasksResult.

Refer to the Pipeline Resolvers guide to learn more about the resolver properties and execution order.

The pipeline service is activated in the base template, as shown by its entry in the subgraphs array.

<span><span style="color: var(--shiki-color-text)">application.#Spec </span><span style="color: var(--shiki-token-keyword)">&amp;</span><span style="color: var(--shiki-color-text)"> {</span></span>
<span><span style="color: var(--shiki-color-text)">	Name: environment.#app.namespace</span></span>
<span><span style="color: var(--shiki-color-text)">	Cors: [</span></span>
<span><span style="color: var(--shiki-color-text)">		</span><span style="color: var(--shiki-color-text)">&quot;</span><span style="color: var(--shiki-token-string-expression)">http://localhost:8080</span><span style="color: var(--shiki-color-text)">&quot;</span><span style="color: var(--shiki-token-punctuation)">,</span></span>
<span><span style="color: var(--shiki-color-text)">		</span><span style="color: var(--shiki-color-text)">&quot;</span><span style="color: var(--shiki-token-string-expression)">http://localhost:8081</span><span style="color: var(--shiki-color-text)">&quot;</span><span style="color: var(--shiki-token-punctuation)">,</span></span>
<span><span style="color: var(--shiki-color-text)">		</span><span style="color: var(--shiki-color-text)">&quot;</span><span style="color: var(--shiki-token-string-expression)">http://localhost:3000</span><span style="color: var(--shiki-color-text)">&quot;</span><span style="color: var(--shiki-token-punctuation)">,</span></span>
<span><span style="color: var(--shiki-color-text)">	]</span></span>
<span><span style="color: var(--shiki-color-text)">	Auth: application.#Auth </span><span style="color: var(--shiki-token-keyword)">&amp;</span><span style="color: var(--shiki-color-text)"> {</span></span>
<span><span style="color: var(--shiki-color-text)">		Namespace:            auth.Namespace</span></span>
<span><span style="color: var(--shiki-color-text)">		IdProviderConfigName: auth.IdProviderConfigs[</span><span style="color: var(--shiki-token-constant)">0</span><span style="color: var(--shiki-color-text)">].Name</span></span>
<span><span style="color: var(--shiki-color-text)">	}</span></span>
<span><span style="color: var(--shiki-color-text)">	Subgraphs: [</span></span>
<span><span style="color: var(--shiki-color-text)">		{Type: common.#TailorDB</span><span style="color: var(--shiki-token-punctuation)">,</span><span style="color: var(--shiki-color-text)"> Name: tailordb.Namespace}</span><span style="color: var(--shiki-token-punctuation)">,</span></span>
<span><span style="color: var(--shiki-color-text)">		{Type: common.#Pipeline</span><span style="color: var(--shiki-token-punctuation)">,</span><span style="color: var(--shiki-color-text)"> Name: pipeline.Namespace}</span><span style="color: var(--shiki-token-punctuation)">,</span></span>
<span><span style="color: var(--shiki-color-text)">	]</span></span>
<span><span style="color: var(--shiki-color-text)">}</span></span>
<span></span>

2. Include the Resolver in the pipeline.cue File

Add the created resolver to the Resolvers array in the pipeline.cue file, allowing the app to access and execute it through the pipeline service.

<span><span style="color: var(--shiki-token-keyword)">package</span><span style="color: var(--shiki-color-text)"> pipeline</span></span>
<span></span>
<span><span style="color: var(--shiki-token-keyword)">import</span><span style="color: var(--shiki-color-text)"> (</span></span>
<span><span style="color: var(--shiki-color-text)">	</span><span style="color: var(--shiki-color-text)">&quot;</span><span style="color: var(--shiki-token-string-expression)">github.com/tailor-platform/tailorctl/schema/v2/pipeline</span><span style="color: var(--shiki-color-text)">&quot;</span></span>
<span><span style="color: var(--shiki-color-text)">	</span><span style="color: var(--shiki-color-text)">&quot;</span><span style="color: var(--shiki-token-string-expression)">tailor.build/template/services/pipeline/resolvers</span><span style="color: var(--shiki-color-text)">&quot;</span></span>
<span><span style="color: var(--shiki-color-text)">	</span><span style="color: var(--shiki-color-text)">&quot;</span><span style="color: var(--shiki-token-string-expression)">tailor.build/template/environment</span><span style="color: var(--shiki-color-text)">&quot;</span></span>
<span><span style="color: var(--shiki-color-text)">)</span></span>
<span></span>
<span><span style="color: var(--shiki-color-text)">pipeline.#Spec </span><span style="color: var(--shiki-token-keyword)">&amp;</span><span style="color: var(--shiki-color-text)"> {</span></span>
<span><span style="color: var(--shiki-color-text)">	Namespace: environment.#app.namespace</span></span>
<span><span style="color: var(--shiki-color-text)">	Resolvers: [</span></span>
<span><span style="color: var(--shiki-color-text)">		resolvers.deleteAllTailorDBRecords</span><span style="color: var(--shiki-token-punctuation)">,</span></span>
<span><span style="color: var(--shiki-color-text)">		resolvers.getProjectStatus</span><span style="color: var(--shiki-token-punctuation)">,</span></span>
<span><span style="color: var(--shiki-color-text)">	]</span></span>
<span><span style="color: var(--shiki-color-text)">}</span></span>
<span></span>

3. Apply the change using tailorctl

<span><span style="color: var(--shiki-token-function)">tailorctl</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string)">workspace</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string)">apply</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string)">-m</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string)">./workspace.cue</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string)">-a</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string)">pipeline</span></span>
<span></span>

4. Review and Test the Created Pipeline Resolver

You can view the created pipeline in the Console.

GetProjectStatus Pipeline Resolver

In the console, select GraphQL Playground and replace the PROJECT_ID with the ID of a project to call the pipeline:

<span><span style="color: var(--shiki-token-keyword)">query</span><span style="color: var(--shiki-color-text)"> {</span></span>
<span><span style="color: var(--shiki-color-text)">  getProjectStatus(input:{ </span><span style="color: var(--shiki-token-string)">projectId</span><span style="color: var(--shiki-color-text)">:</span><span style="color: var(--shiki-token-comment)">&quot;PROJECT_ID&quot;</span><span style="color: var(--shiki-color-text)">}) {</span></span>
<span><span style="color: var(--shiki-color-text)">    projectId</span></span>
<span><span style="color: var(--shiki-color-text)">    projectName</span></span>
<span><span style="color: var(--shiki-color-text)">    status</span></span>
<span><span style="color: var(--shiki-color-text)">    result{</span></span>
<span><span style="color: var(--shiki-color-text)">      id</span></span>
<span><span style="color: var(--shiki-color-text)">      projectId</span></span>
<span><span style="color: var(--shiki-color-text)">      name</span></span>
<span><span style="color: var(--shiki-color-text)">      status</span></span>
<span><span style="color: var(--shiki-color-text)">    }</span></span>
<span><span style="color: var(--shiki-color-text)">  }</span></span>
<span><span style="color: var(--shiki-color-text)">}</span></span>
<span></span>

This resolver fetches detailed project information, enabling dashboard and other project-overview use cases.

<span><span style="color: var(--shiki-color-text)">{</span></span>
<span><span style="color: var(--shiki-color-text)">  </span><span style="color: var(--shiki-token-comment)">&quot;data&quot;</span><span style="color: var(--shiki-color-text)">: {</span></span>
<span><span style="color: var(--shiki-color-text)">    </span><span style="color: var(--shiki-token-comment)">&quot;getProjectStatus&quot;</span><span style="color: var(--shiki-color-text)">: {</span></span>
<span><span style="color: var(--shiki-color-text)">      </span><span style="color: var(--shiki-token-comment)">&quot;projectId&quot;</span><span style="color: var(--shiki-color-text)">: </span><span style="color: var(--shiki-token-comment)">&quot;fdf488be-39c2-4155-ad81-901d4d4e31ad&quot;</span><span style="color: var(--shiki-color-text)">,</span></span>
<span><span style="color: var(--shiki-color-text)">      </span><span style="color: var(--shiki-token-comment)">&quot;projectName&quot;</span><span style="color: var(--shiki-color-text)">: </span><span style="color: var(--shiki-token-comment)">&quot;Mobile App Development&quot;</span><span style="color: var(--shiki-color-text)">,</span></span>
<span><span style="color: var(--shiki-color-text)">      </span><span style="color: var(--shiki-token-comment)">&quot;status&quot;</span><span style="color: var(--shiki-color-text)">: </span><span style="color: var(--shiki-token-comment)">&quot;In Progress&quot;</span><span style="color: var(--shiki-color-text)">,</span></span>
<span><span style="color: var(--shiki-color-text)">      </span><span style="color: var(--shiki-token-comment)">&quot;result&quot;</span><span style="color: var(--shiki-color-text)">: [</span></span>
<span><span style="color: var(--shiki-color-text)">        {</span></span>
<span><span style="color: var(--shiki-color-text)">          </span><span style="color: var(--shiki-token-comment)">&quot;id&quot;</span><span style="color: var(--shiki-color-text)">: </span><span style="color: var(--shiki-token-comment)">&quot;da724314-c2c8-57ed-8666-c88a1051f98d&quot;</span><span style="color: var(--shiki-color-text)">,</span></span>
<span><span style="color: var(--shiki-color-text)">          </span><span style="color: var(--shiki-token-comment)">&quot;projectId&quot;</span><span style="color: var(--shiki-color-text)">: </span><span style="color: var(--shiki-token-comment)">&quot;fdf488be-39c2-4155-ad81-901d4d4e31ad&quot;</span><span style="color: var(--shiki-color-text)">,</span></span>
<span><span style="color: var(--shiki-color-text)">          </span><span style="color: var(--shiki-token-comment)">&quot;name&quot;</span><span style="color: var(--shiki-color-text)">: </span><span style="color: var(--shiki-token-comment)">&quot;User Profile Module&quot;</span><span style="color: var(--shiki-color-text)">,</span></span>
<span><span style="color: var(--shiki-color-text)">          </span><span style="color: var(--shiki-token-comment)">&quot;status&quot;</span><span style="color: var(--shiki-color-text)">: </span><span style="color: var(--shiki-token-comment)">&quot;Completed&quot;</span></span>
<span><span style="color: var(--shiki-color-text)">        },</span></span>
<span><span style="color: var(--shiki-color-text)">        {</span></span>
<span><span style="color: var(--shiki-color-text)">          </span><span style="color: var(--shiki-token-comment)">&quot;id&quot;</span><span style="color: var(--shiki-color-text)">: </span><span style="color: var(--shiki-token-comment)">&quot;688312b4-8975-56a5-b888-91e916616c6e&quot;</span><span style="color: var(--shiki-color-text)">,</span></span>
<span><span style="color: var(--shiki-color-text)">          </span><span style="color: var(--shiki-token-comment)">&quot;projectId&quot;</span><span style="color: var(--shiki-color-text)">: </span><span style="color: var(--shiki-token-comment)">&quot;fdf488be-39c2-4155-ad81-901d4d4e31ad&quot;</span><span style="color: var(--shiki-color-text)">,</span></span>
<span><span style="color: var(--shiki-color-text)">          </span><span style="color: var(--shiki-token-comment)">&quot;name&quot;</span><span style="color: var(--shiki-color-text)">: </span><span style="color: var(--shiki-token-comment)">&quot;Mobile App Architecture&quot;</span><span style="color: var(--shiki-color-text)">,</span></span>
<span><span style="color: var(--shiki-color-text)">          </span><span style="color: var(--shiki-token-comment)">&quot;status&quot;</span><span style="color: var(--shiki-color-text)">: </span><span style="color: var(--shiki-token-comment)">&quot;In Progress&quot;</span></span>
<span><span style="color: var(--shiki-color-text)">        }</span></span>
<span><span style="color: var(--shiki-color-text)">      ]</span></span>
<span><span style="color: var(--shiki-color-text)">    }</span></span>
<span><span style="color: var(--shiki-color-text)">  }</span></span>
<span><span style="color: var(--shiki-color-text)">}</span></span>
<span></span>