Database/xyz/Functions/fn_GetAssetTypeList.sqladded
--liquibase formatted sql
--changeset agentneo:fn_GetAssetTypeList runOnChange:true stripComments:false endDelimiter:/
--comment: Create or replace xyz."fn_GetAssetTypeList"

------------------------------------------------------------------------------------
-- Created by:  AgentNeo
-- Created on:  07/07/2026
-- Description: Get a paginated list of asset types for a given project
------------------------------------------------------------------------------------

DROP FUNCTION IF EXISTS xyz."fn_GetAssetTypeList";

CREATE OR REPLACE FUNCTION xyz."fn_GetAssetTypeList" (
    _projectId UUID,
    _lastFetchedIndexId INTEGER DEFAULT NULL,
    _limit INTEGER DEFAULT 1000,
    _lastSyncDateTime TIMESTAMP WITH TIME ZONE DEFAULT NULL
)
RETURNS TABLE (
    "AssetTypeId"             UUID,
    "CommissioningWorkflowId" UUID,
    "Name"                    TEXT,
    "CreatedBy"               TEXT,
    "InsertedOn"              TIMESTAMP WITH TIME ZONE,
    "LastModifiedOn"          TIMESTAMP WITH TIME ZONE,
    "LastModifiedBy"          TEXT,
    "Id"                      INTEGER
)
AS $$
DECLARE
    -- project id map
    _projectShardId INT;
BEGIN
    -- get shard id from uuid
    SELECT xyz."fn_GetProjectShardId"(_projectId) INTO _projectShardId;

    RETURN QUERY
    SELECT
        at."AssetTypeId",
        at."CommissioningWorkflowId",
        at."Name",
        at."CreatedBy",
        at."InsertedOn",
        at."LastModifiedOn",
        at."LastModifiedBy",
        at."Id"
    FROM xyz."AssetType" at
    WHERE at."ProjectShardId" = _projectShardId
      AND (
        CASE
            WHEN _lastFetchedIndexId IS NOT NULL THEN at."Id" > _lastFetchedIndexId
            ELSE TRUE
        END
      )
      AND (
        CASE
            WHEN _lastSyncDateTime IS NOT NULL THEN COALESCE(at."LastModifiedOn", at."InsertedOn") > _lastSyncDateTime
            ELSE TRUE
        END
      )
    ORDER BY at."Id" ASC
    LIMIT _limit;
END;
$$
LANGUAGE plpgsql;
/