@pgpm/database-jobs 0.26.1 → 0.26.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/Makefile CHANGED
@@ -1,5 +1,5 @@
1
1
  EXTENSION = pgpm-database-jobs
2
- DATA = sql/pgpm-database-jobs--0.26.0.sql
2
+ DATA = sql/pgpm-database-jobs--0.26.1.sql
3
3
 
4
4
  PG_CONFIG = pg_config
5
5
  PGXS := $(shell $(PG_CONFIG) --pgxs)
@@ -14,7 +14,9 @@ CREATE FUNCTION app_jobs.add_job (
14
14
  run_at timestamptz DEFAULT now(),
15
15
  max_attempts integer DEFAULT 25,
16
16
  priority integer DEFAULT 0,
17
- entity_id uuid DEFAULT NULL
17
+ entity_id uuid DEFAULT NULL,
18
+ organization_id uuid DEFAULT NULL,
19
+ entity_type text DEFAULT NULL
18
20
  )
19
21
  RETURNS app_jobs.jobs
20
22
  AS $$
@@ -33,6 +35,8 @@ BEGIN
33
35
  database_id,
34
36
  actor_id,
35
37
  entity_id,
38
+ organization_id,
39
+ entity_type,
36
40
  task_identifier,
37
41
  payload,
38
42
  queue_name,
@@ -44,6 +48,8 @@ BEGIN
44
48
  v_database_id,
45
49
  v_actor_id,
46
50
  add_job.entity_id,
51
+ add_job.organization_id,
52
+ add_job.entity_type,
47
53
  identifier,
48
54
  coalesce(payload, '{}'::json),
49
55
  queue_name,
@@ -88,6 +94,8 @@ BEGIN
88
94
  database_id,
89
95
  actor_id,
90
96
  entity_id,
97
+ organization_id,
98
+ entity_type,
91
99
  task_identifier,
92
100
  payload,
93
101
  queue_name,
@@ -98,6 +106,8 @@ BEGIN
98
106
  v_database_id,
99
107
  v_actor_id,
100
108
  add_job.entity_id,
109
+ add_job.organization_id,
110
+ add_job.entity_type,
101
111
  identifier,
102
112
  payload,
103
113
  queue_name,
@@ -7,6 +7,8 @@ CREATE TABLE app_jobs.jobs (
7
7
  database_id uuid,
8
8
  actor_id uuid,
9
9
  entity_id uuid,
10
+ organization_id uuid,
11
+ entity_type text,
10
12
  queue_name text DEFAULT NULL,
11
13
  task_identifier text NOT NULL,
12
14
  payload json DEFAULT '{}' ::json NOT NULL,
@@ -32,6 +34,8 @@ COMMENT ON COLUMN app_jobs.jobs.id IS 'Auto-incrementing job identifier';
32
34
  COMMENT ON COLUMN app_jobs.jobs.database_id IS 'Database this job belongs to (nullable for system-level jobs without tenant context)';
33
35
  COMMENT ON COLUMN app_jobs.jobs.actor_id IS 'User who triggered this job, read from JWT claims at enqueue time';
34
36
  COMMENT ON COLUMN app_jobs.jobs.entity_id IS 'Entity (org/team) this job is scoped to for billing; NULL means platform-level (resolved via database_id → owner_id)';
37
+ COMMENT ON COLUMN app_jobs.jobs.organization_id IS 'Top-level organization for this entity; resolved at enqueue time via get_organization_id(entity_type, entity_id)';
38
+ COMMENT ON COLUMN app_jobs.jobs.entity_type IS 'Entity type prefix (org, team, app, etc.) for interpreting entity_id';
35
39
  COMMENT ON COLUMN app_jobs.jobs.queue_name IS 'Name of the queue this job belongs to; used for worker routing and concurrency control';
36
40
  COMMENT ON COLUMN app_jobs.jobs.task_identifier IS 'Identifier for the task type (maps to a worker handler function)';
37
41
  COMMENT ON COLUMN app_jobs.jobs.payload IS 'JSON payload of arguments passed to the task handler';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pgpm/database-jobs",
3
- "version": "0.26.1",
3
+ "version": "0.26.2",
4
4
  "description": "Database-specific job handling and queue management",
5
5
  "author": "Dan Lynch <pyramation@gmail.com>",
6
6
  "contributors": [
@@ -35,5 +35,5 @@
35
35
  "bugs": {
36
36
  "url": "https://github.com/constructive-io/pgpm-modules/issues"
37
37
  },
38
- "gitHead": "e1f2e9bec1c91d0751ebe49e9193459191d3c464"
38
+ "gitHead": "d938867e5d7c0e7b2e130a2bdc5d58cd0d5874e1"
39
39
  }
@@ -1,6 +1,6 @@
1
1
  # pgpm-database-jobs extension
2
2
  comment = 'pgpm-database-jobs extension'
3
- default_version = '0.26.0'
3
+ default_version = '0.26.1'
4
4
  module_pathname = '$libdir/pgpm-database-jobs'
5
5
  requires = 'plpgsql,pgcrypto,pgpm-verify,pgpm-jwt-claims'
6
6
  relocatable = false
@@ -53,9 +53,7 @@ $EOFCODE$ LANGUAGE plpgsql VOLATILE SECURITY DEFINER;
53
53
 
54
54
  COMMENT ON FUNCTION app_jobs.tg_add_job_with_row IS 'Useful shortcut to create a job on insert or update. Pass the task name as the trigger argument, and the record data will automatically be available on the JSON payload.';
55
55
 
56
- CREATE FUNCTION app_jobs.json_build_object_apply(
57
- arguments text[]
58
- ) RETURNS pg_catalog.json AS $EOFCODE$
56
+ CREATE FUNCTION app_jobs.json_build_object_apply(arguments text[]) RETURNS pg_catalog.json AS $EOFCODE$
59
57
  DECLARE
60
58
  arg text;
61
59
  _sql text;
@@ -195,6 +193,8 @@ CREATE TABLE app_jobs.jobs (
195
193
  database_id uuid,
196
194
  actor_id uuid,
197
195
  entity_id uuid,
196
+ organization_id uuid,
197
+ entity_type text,
198
198
  queue_name text DEFAULT NULL,
199
199
  task_identifier text NOT NULL,
200
200
  payload pg_catalog.json DEFAULT '{}'::json NOT NULL,
@@ -226,6 +226,10 @@ COMMENT ON COLUMN app_jobs.jobs.actor_id IS 'User who triggered this job, read f
226
226
 
227
227
  COMMENT ON COLUMN app_jobs.jobs.entity_id IS 'Entity (org/team) this job is scoped to for billing; NULL means platform-level (resolved via database_id → owner_id)';
228
228
 
229
+ COMMENT ON COLUMN app_jobs.jobs.organization_id IS 'Top-level organization for this entity; resolved at enqueue time via get_organization_id(entity_type, entity_id)';
230
+
231
+ COMMENT ON COLUMN app_jobs.jobs.entity_type IS 'Entity type prefix (org, team, app, etc.) for interpreting entity_id';
232
+
229
233
  COMMENT ON COLUMN app_jobs.jobs.queue_name IS 'Name of the queue this job belongs to; used for worker routing and concurrency control';
230
234
 
231
235
  COMMENT ON COLUMN app_jobs.jobs.task_identifier IS 'Identifier for the task type (maps to a worker handler function)';
@@ -374,10 +378,7 @@ CREATE INDEX job_queues_locked_by_idx ON app_jobs.job_queues (locked_by);
374
378
 
375
379
  GRANT SELECT, INSERT, UPDATE, DELETE ON app_jobs.job_queues TO administrator;
376
380
 
377
- CREATE FUNCTION app_jobs.run_scheduled_job(
378
- id bigint,
379
- job_expiry interval DEFAULT '1 hours'
380
- ) RETURNS app_jobs.jobs AS $EOFCODE$
381
+ CREATE FUNCTION app_jobs.run_scheduled_job(id bigint, job_expiry interval DEFAULT '1 hours') RETURNS app_jobs.jobs AS $EOFCODE$
381
382
  DECLARE
382
383
  j app_jobs.jobs;
383
384
  last_id bigint;
@@ -448,13 +449,7 @@ BEGIN
448
449
  END;
449
450
  $EOFCODE$ LANGUAGE plpgsql VOLATILE;
450
451
 
451
- CREATE FUNCTION app_jobs.reschedule_jobs(
452
- job_ids bigint[],
453
- run_at timestamptz DEFAULT NULL,
454
- priority int DEFAULT NULL,
455
- attempts int DEFAULT NULL,
456
- max_attempts int DEFAULT NULL
457
- ) RETURNS SETOF app_jobs.jobs LANGUAGE sql AS $EOFCODE$
452
+ CREATE FUNCTION app_jobs.reschedule_jobs(job_ids bigint[], run_at timestamptz DEFAULT NULL, priority int DEFAULT NULL, attempts int DEFAULT NULL, max_attempts int DEFAULT NULL) RETURNS SETOF app_jobs.jobs LANGUAGE sql AS $EOFCODE$
458
453
  UPDATE
459
454
  app_jobs.jobs
460
455
  SET
@@ -470,10 +465,7 @@ CREATE FUNCTION app_jobs.reschedule_jobs(
470
465
  *;
471
466
  $EOFCODE$;
472
467
 
473
- CREATE FUNCTION app_jobs.release_scheduled_jobs(
474
- worker_id text,
475
- ids bigint[] DEFAULT NULL
476
- ) RETURNS void AS $EOFCODE$
468
+ CREATE FUNCTION app_jobs.release_scheduled_jobs(worker_id text, ids bigint[] DEFAULT NULL) RETURNS void AS $EOFCODE$
477
469
  DECLARE
478
470
  BEGIN
479
471
  -- clear the scheduled job
@@ -489,9 +481,7 @@ BEGIN
489
481
  END;
490
482
  $EOFCODE$ LANGUAGE plpgsql VOLATILE;
491
483
 
492
- CREATE FUNCTION app_jobs.release_jobs(
493
- worker_id text
494
- ) RETURNS void AS $EOFCODE$
484
+ CREATE FUNCTION app_jobs.release_jobs(worker_id text) RETURNS void AS $EOFCODE$
495
485
  DECLARE
496
486
  BEGIN
497
487
  -- clear the job
@@ -514,10 +504,7 @@ BEGIN
514
504
  END;
515
505
  $EOFCODE$ LANGUAGE plpgsql VOLATILE;
516
506
 
517
- CREATE FUNCTION app_jobs.permanently_fail_jobs(
518
- job_ids bigint[],
519
- error_message text DEFAULT NULL
520
- ) RETURNS SETOF app_jobs.jobs LANGUAGE sql AS $EOFCODE$
507
+ CREATE FUNCTION app_jobs.permanently_fail_jobs(job_ids bigint[], error_message text DEFAULT NULL) RETURNS SETOF app_jobs.jobs LANGUAGE sql AS $EOFCODE$
521
508
  UPDATE
522
509
  app_jobs.jobs
523
510
  SET
@@ -531,10 +518,7 @@ CREATE FUNCTION app_jobs.permanently_fail_jobs(
531
518
  *;
532
519
  $EOFCODE$;
533
520
 
534
- CREATE FUNCTION app_jobs.get_scheduled_job(
535
- worker_id text,
536
- task_identifiers text[] DEFAULT NULL
537
- ) RETURNS app_jobs.scheduled_jobs LANGUAGE plpgsql AS $EOFCODE$
521
+ CREATE FUNCTION app_jobs.get_scheduled_job(worker_id text, task_identifiers text[] DEFAULT NULL) RETURNS app_jobs.scheduled_jobs LANGUAGE plpgsql AS $EOFCODE$
538
522
  DECLARE
539
523
  v_job_id bigint;
540
524
  v_row app_jobs.scheduled_jobs;
@@ -586,11 +570,7 @@ BEGIN
586
570
  END;
587
571
  $EOFCODE$;
588
572
 
589
- CREATE FUNCTION app_jobs.get_job(
590
- worker_id text,
591
- task_identifiers text[] DEFAULT NULL,
592
- job_expiry interval DEFAULT '4 hours'
593
- ) RETURNS app_jobs.jobs LANGUAGE plpgsql AS $EOFCODE$
573
+ CREATE FUNCTION app_jobs.get_job(worker_id text, task_identifiers text[] DEFAULT NULL, job_expiry interval DEFAULT '4 hours') RETURNS app_jobs.jobs LANGUAGE plpgsql AS $EOFCODE$
594
574
  DECLARE
595
575
  v_job_id bigint;
596
576
  v_queue_name text;
@@ -645,11 +625,7 @@ BEGIN
645
625
  END;
646
626
  $EOFCODE$;
647
627
 
648
- CREATE FUNCTION app_jobs.fail_job(
649
- worker_id text,
650
- job_id bigint,
651
- error_message text
652
- ) RETURNS app_jobs.jobs LANGUAGE plpgsql STRICT AS $EOFCODE$
628
+ CREATE FUNCTION app_jobs.fail_job(worker_id text, job_id bigint, error_message text) RETURNS app_jobs.jobs LANGUAGE plpgsql STRICT AS $EOFCODE$
653
629
  DECLARE
654
630
  v_row app_jobs.jobs;
655
631
  BEGIN
@@ -679,9 +655,7 @@ BEGIN
679
655
  END;
680
656
  $EOFCODE$;
681
657
 
682
- CREATE FUNCTION app_jobs.complete_jobs(
683
- job_ids bigint[]
684
- ) RETURNS SETOF app_jobs.jobs LANGUAGE sql AS $EOFCODE$
658
+ CREATE FUNCTION app_jobs.complete_jobs(job_ids bigint[]) RETURNS SETOF app_jobs.jobs LANGUAGE sql AS $EOFCODE$
685
659
  DELETE FROM app_jobs.jobs
686
660
  WHERE id = ANY (job_ids)
687
661
  AND (locked_by IS NULL
@@ -690,10 +664,7 @@ CREATE FUNCTION app_jobs.complete_jobs(
690
664
  *;
691
665
  $EOFCODE$;
692
666
 
693
- CREATE FUNCTION app_jobs.complete_job(
694
- worker_id text,
695
- job_id bigint
696
- ) RETURNS app_jobs.jobs LANGUAGE plpgsql AS $EOFCODE$
667
+ CREATE FUNCTION app_jobs.complete_job(worker_id text, job_id bigint) RETURNS app_jobs.jobs LANGUAGE plpgsql AS $EOFCODE$
697
668
  DECLARE
698
669
  v_row app_jobs.jobs;
699
670
  BEGIN
@@ -715,16 +686,7 @@ BEGIN
715
686
  END;
716
687
  $EOFCODE$;
717
688
 
718
- CREATE FUNCTION app_jobs.add_scheduled_job(
719
- identifier text,
720
- payload pg_catalog.json DEFAULT '{}'::json,
721
- schedule_info pg_catalog.json DEFAULT '{}'::json,
722
- job_key text DEFAULT NULL,
723
- queue_name text DEFAULT NULL,
724
- max_attempts int DEFAULT 25,
725
- priority int DEFAULT 0,
726
- entity_id uuid DEFAULT NULL
727
- ) RETURNS app_jobs.scheduled_jobs AS $EOFCODE$
689
+ CREATE FUNCTION app_jobs.add_scheduled_job(identifier text, payload pg_catalog.json DEFAULT '{}'::json, schedule_info pg_catalog.json DEFAULT '{}'::json, job_key text DEFAULT NULL, queue_name text DEFAULT NULL, max_attempts int DEFAULT 25, priority int DEFAULT 0, entity_id uuid DEFAULT NULL) RETURNS app_jobs.scheduled_jobs AS $EOFCODE$
728
690
  DECLARE
729
691
  v_job app_jobs.scheduled_jobs;
730
692
  v_database_id uuid;
@@ -812,16 +774,7 @@ BEGIN
812
774
  END;
813
775
  $EOFCODE$ LANGUAGE plpgsql VOLATILE SECURITY DEFINER;
814
776
 
815
- CREATE FUNCTION app_jobs.add_job(
816
- identifier text,
817
- payload pg_catalog.json DEFAULT '{}'::json,
818
- job_key text DEFAULT NULL,
819
- queue_name text DEFAULT NULL,
820
- run_at timestamptz DEFAULT now(),
821
- max_attempts int DEFAULT 25,
822
- priority int DEFAULT 0,
823
- entity_id uuid DEFAULT NULL
824
- ) RETURNS app_jobs.jobs AS $EOFCODE$
777
+ CREATE FUNCTION app_jobs.add_job(identifier text, payload pg_catalog.json DEFAULT '{}'::json, job_key text DEFAULT NULL, queue_name text DEFAULT NULL, run_at timestamptz DEFAULT now(), max_attempts int DEFAULT 25, priority int DEFAULT 0, entity_id uuid DEFAULT NULL, organization_id uuid DEFAULT NULL, entity_type text DEFAULT NULL) RETURNS app_jobs.jobs AS $EOFCODE$
825
778
  DECLARE
826
779
  v_job app_jobs.jobs;
827
780
  v_database_id uuid;
@@ -837,6 +790,8 @@ BEGIN
837
790
  database_id,
838
791
  actor_id,
839
792
  entity_id,
793
+ organization_id,
794
+ entity_type,
840
795
  task_identifier,
841
796
  payload,
842
797
  queue_name,
@@ -848,6 +803,8 @@ BEGIN
848
803
  v_database_id,
849
804
  v_actor_id,
850
805
  add_job.entity_id,
806
+ add_job.organization_id,
807
+ add_job.entity_type,
851
808
  identifier,
852
809
  coalesce(payload, '{}'::json),
853
810
  queue_name,
@@ -892,6 +849,8 @@ BEGIN
892
849
  database_id,
893
850
  actor_id,
894
851
  entity_id,
852
+ organization_id,
853
+ entity_type,
895
854
  task_identifier,
896
855
  payload,
897
856
  queue_name,
@@ -902,6 +861,8 @@ BEGIN
902
861
  v_database_id,
903
862
  v_actor_id,
904
863
  add_job.entity_id,
864
+ add_job.organization_id,
865
+ add_job.entity_type,
905
866
  identifier,
906
867
  payload,
907
868
  queue_name,
@@ -915,9 +876,7 @@ BEGIN
915
876
  END;
916
877
  $EOFCODE$ LANGUAGE plpgsql VOLATILE SECURITY DEFINER;
917
878
 
918
- CREATE FUNCTION app_jobs.remove_job(
919
- job_key text
920
- ) RETURNS app_jobs.jobs LANGUAGE plpgsql STRICT AS $EOFCODE$
879
+ CREATE FUNCTION app_jobs.remove_job(job_key text) RETURNS app_jobs.jobs LANGUAGE plpgsql STRICT AS $EOFCODE$
921
880
  DECLARE
922
881
  v_job app_jobs.jobs;
923
882
  BEGIN
@@ -942,9 +901,7 @@ BEGIN
942
901
  END;
943
902
  $EOFCODE$;
944
903
 
945
- CREATE FUNCTION app_jobs.force_unlock_workers(
946
- worker_ids text[]
947
- ) RETURNS void LANGUAGE sql VOLATILE AS $EOFCODE$
904
+ CREATE FUNCTION app_jobs.force_unlock_workers(worker_ids text[]) RETURNS void LANGUAGE sql VOLATILE AS $EOFCODE$
948
905
  UPDATE app_jobs.jobs
949
906
  SET locked_at = NULL, locked_by = NULL
950
907
  WHERE locked_by = ANY (worker_ids);