UNPKG

@imqueue/pg-cache

Version:

PostgreSQL managed cache on Redis for @imqueue-based service methods

76 lines (69 loc) 2.35 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.PG_CACHE_TRIGGER = exports.PG_CACHE_DEBUG = exports.DEFAULT_CACHE_TTL = void 0; exports.setInfo = setInfo; exports.setError = setError; exports.fetchError = fetchError; exports.initError = initError; exports.DEFAULT_CACHE_TTL = 86400000; // 24 hrs in milliseconds exports.PG_CACHE_DEBUG = !!+(process.env.PG_CACHE_DEBUG || 0); exports.PG_CACHE_TRIGGER = `CREATE FUNCTION post_change_notify_trigger() RETURNS TRIGGER LANGUAGE plpgsql AS $$ DECLARE rec RECORD; payload TEXT; payload_items TEXT[]; column_names TEXT[]; column_name TEXT; column_value TEXT; channel CHARACTER VARYING(255); BEGIN channel := TG_TABLE_NAME; CASE TG_OP WHEN 'INSERT', 'UPDATE' THEN rec := NEW; WHEN 'DELETE' THEN rec := OLD; ELSE RAISE EXCEPTION 'NOTIFY: Invalid operation "%"!', TG_OP; END CASE; SELECT array_agg("c"."column_name"::TEXT) INTO column_names FROM "information_schema"."columns" AS "c" WHERE "c"."table_name" = TG_TABLE_NAME; FOREACH column_name IN ARRAY column_names LOOP EXECUTE FORMAT('SELECT $1.%I::TEXT', column_name) INTO column_value USING rec; payload_items := ARRAY_CAT( payload_items, ARRAY [column_name, column_value] ); END LOOP; payload := json_build_object( 'timestamp', CURRENT_TIMESTAMP, 'operation', TG_OP, 'schema', TG_TABLE_SCHEMA, 'table', TG_TABLE_NAME, 'record', TO_JSON(JSON_OBJECT(payload_items)) ); PERFORM PG_NOTIFY(channel, payload); RETURN rec; END; $$; `; function setInfo(logger, res, key, decorator) { exports.PG_CACHE_DEBUG && logger.info(`PgCache:${decorator.name}: cache key '${key}' saved!`); return res; } function setError(logger, err, key, decorator) { logger.warn(`PgCache:${decorator.name}: saving cache key '${key}' error:`, err); } function fetchError(logger, err, key, decorator) { logger.warn(`PgCache:${decorator.name}: fetching cache key '${key}' error:`, err); } function initError(logger, className, methodName, decorator) { logger.warn(`PgCache:${decorator.name}: cache is not initialized on ${className}, called in ${methodName}`); } //# sourceMappingURL=env.js.map