stoicolo / landing-spa-nuxt-api

API for a Landing Page and Context Manegement Nuxt App
MIT License
0 stars 0 forks source link

Respuesta JSON #16

Closed jpaguero closed 1 month ago

jpaguero commented 1 month ago
{
  "isPublic": true,
  "isActive": true,
  "menu": [
     {
        "menuName": "string",
        "slug": "string",
        "iconName": "string",
        "order": 0
     }
  ],
  "pages": [
     {
         "id": "string | number",
         "slug": "string",
         "sections": [
                        {
                              "id": 0,
                              "widget": {
                                            "id": "string | number",
                                            "name": "string",
                                            "element": {
                                                             "template": null,
                                                             "key": "string" // Estos son los props que vienen del widget, son diferentes en cada widget
                                            }
                              }
                        },
                        {...otro section},
                        {...otro section}
         ]
      }
  ]
}
francomac commented 1 month ago

script ajustado para obtener sections del pageTemplate según las pages de un website en especifico.

CREATE OR REPLACE FUNCTION update_public_website()
RETURNS TRIGGER
AS $$
DECLARE
    payload JSON;
    response JSON;
    current_timestamp TIMESTAMP;
BEGIN
    -- Obtener el timestamp actual
    SELECT NOW() INTO current_timestamp;
    -- Construir el payload JSON
    payload := json_build_object(
        'menu', (
            SELECT json_agg(json_build_object(
                'menuName', md."menuName",
                'slug', md.slug,
                'iconName', md."iconName",
                'order', md."order"
            ))
            FROM "MenuDetail" md
            JOIN "MenuHeader" mh ON md."menuHeaderId" = mh.id
            WHERE mh."websiteId" = NEW."websiteId"
        ),
        'pages', (
            SELECT json_agg(json_build_object(
                'id', p.id,
                'pageName', p."pageName",
                'sections', (
                    SELECT pt.sections
                    FROM "PageTemplate" pt
                    WHERE pt."id" = p."templateId"
                )
            ))
            FROM "Page" p
            WHERE p."websiteId" = NEW."websiteId"
        )
    );
    -- Insertar el nuevo registro en PublicWebsite
    INSERT INTO "PublicWebsite" (
        "websiteId", 
        content, 
        "isPublic", 
        "isActive", 
        "createdAt", 
        "updatedAt"
    )
    VALUES (
        NEW."websiteId", 
        payload, 
        NEW."isPublic",
        NEW."isActive",
        current_timestamp, 
        current_timestamp
    );
    RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER trigger_update_public_website
AFTER INSERT OR UPDATE ON "PublishHistory"
FOR EACH ROW
EXECUTE FUNCTION update_public_website();
francomac commented 1 month ago

Nuevo request, modificar el script del comment anterior de la siguiente manera:

francomac commented 1 month ago

Slug agregado en el script, y validación agregada para no ingresar multiples records en cada ejecución del Trigger.

image
CREATE OR REPLACE FUNCTION update_public_website()
RETURNS TRIGGER
LANGUAGE plpgsql
AS $$
DECLARE
    payload JSON;
    response JSON;
    current_timestamp TIMESTAMP;
    existing_record_id INTEGER;
BEGIN
    -- Construir el payload JSON
    payload := json_build_object(
        'menu', (
            SELECT json_agg(json_build_object(
                'menuName', md."menuName",
                'slug', md.slug,
                'iconName', md."iconName",
                'order', md."order"
            ))
            FROM "MenuDetail" md
            JOIN "MenuHeader" mh ON md."menuHeaderId" = mh.id
            WHERE mh."websiteId" = NEW."websiteId"
        ),
        'pages', (
            SELECT json_agg(json_build_object(
                'id', p.id,
                'pageName', p."pageName",
                'slug', (
                    SELECT md.slug
                    FROM "MenuDetail" md
                    WHERE md."pageId" = p.id
                    LIMIT 1
                ),
                'sections', (
                    SELECT pt.sections
                    FROM "PageTemplate" pt
                    WHERE pt."id" = p."templateId"
                )
            ))
            FROM "Page" p
            WHERE p."websiteId" = NEW."websiteId"
        )
    );

    -- Verificar si ya existe un registro para este websiteId
    SELECT id INTO existing_record_id
    FROM "PublicWebsite"
    WHERE "websiteId" = NEW."websiteId"
    LIMIT 1;

    IF existing_record_id IS NULL THEN
        -- Obtener el timestamp actual justo antes de la inserción
        SELECT NOW() INTO current_timestamp;
        -- No existe un registro, así que insertamos uno nuevo
        INSERT INTO "PublicWebsite" (
            "websiteId", 
            content, 
            "isPublic", 
            "isActive",
            "publishedAt",
            "createdAt",
            "updatedAt"
        )
        VALUES (
            NEW."websiteId", 
            payload, 
            NEW."isPublic",
            NEW."isActive",
            NEW."publishedAt", 
            current_timestamp,
            current_timestamp
        );
    ELSE
        -- Obtener el timestamp actual justo antes de la actualización
        SELECT NOW() INTO current_timestamp;
        -- Existe un registro, así que lo actualizamos
        UPDATE "PublicWebsite"
        SET 
            content = payload,
            "isPublic" = NEW."isPublic",
            "isActive" = NEW."isActive",
            "publishedAt" = NEW."publishedAt"
        WHERE id = existing_record_id;
    END IF;

    RETURN NEW;
END;
$$;
francomac commented 1 month ago

@jpaguero luego de hacer pull, debe borrar UNICAMENTE las tablas: PublicWebsite y PublishHistory. finalmente, corra el nuevo script del comentario anterior.

En este punto ya estaría listo para ejecutar un POST de una publicación nueva, luego si desea modificarla debe ejecutar un PATCH