@pgpm/database-jobs 0.20.2 → 0.21.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.
Files changed (26) hide show
  1. package/README.md +29 -35
  2. package/deploy/schemas/app_jobs/procedures/add_job.sql +38 -34
  3. package/deploy/schemas/app_jobs/procedures/add_scheduled_job.sql +31 -21
  4. package/deploy/schemas/app_jobs/procedures/force_unlock_workers.sql +20 -0
  5. package/deploy/schemas/app_jobs/procedures/get_job.sql +27 -51
  6. package/deploy/schemas/app_jobs/procedures/remove_job.sql +34 -0
  7. package/deploy/schemas/app_jobs/procedures/run_scheduled_job.sql +2 -0
  8. package/deploy/schemas/app_jobs/tables/jobs/indexes/priority_run_at_id_idx.sql +11 -2
  9. package/deploy/schemas/app_jobs/tables/jobs/table.sql +9 -5
  10. package/deploy/schemas/app_jobs/tables/jobs/triggers/notify_worker.sql +15 -5
  11. package/deploy/schemas/app_jobs/tables/scheduled_jobs/table.sql +7 -5
  12. package/deploy/schemas/app_jobs/triggers/tg_add_job_with_fields.sql +1 -1
  13. package/deploy/schemas/app_jobs/triggers/tg_add_job_with_row.sql +2 -2
  14. package/deploy/schemas/app_jobs/triggers/tg_add_job_with_row_id.sql +2 -2
  15. package/package.json +5 -4
  16. package/pgpm-database-jobs.control +2 -2
  17. package/pgpm.plan +4 -2
  18. package/revert/schemas/app_jobs/procedures/force_unlock_workers.sql +7 -0
  19. package/revert/schemas/app_jobs/procedures/remove_job.sql +7 -0
  20. package/revert/schemas/app_jobs/tables/jobs/indexes/priority_run_at_id_idx.sql +3 -1
  21. package/revert/schemas/app_jobs/tables/jobs/triggers/notify_worker.sql +3 -2
  22. package/verify/schemas/app_jobs/procedures/force_unlock_workers.sql +7 -0
  23. package/verify/schemas/app_jobs/procedures/remove_job.sql +7 -0
  24. package/verify/schemas/app_jobs/tables/jobs/indexes/priority_run_at_id_idx.sql +2 -1
  25. package/verify/schemas/app_jobs/tables/jobs/triggers/notify_worker.sql +1 -2
  26. package/sql/pgpm-database-jobs--0.15.3.sql +0 -805
@@ -4,8 +4,9 @@
4
4
  BEGIN;
5
5
  CREATE TABLE app_jobs.scheduled_jobs (
6
6
  id bigserial PRIMARY KEY,
7
- database_id uuid NOT NULL,
8
- queue_name text DEFAULT (public.gen_random_uuid ()) ::text,
7
+ database_id uuid,
8
+ actor_id uuid,
9
+ queue_name text DEFAULT NULL,
9
10
  task_identifier text NOT NULL,
10
11
  payload json DEFAULT '{}' ::json NOT NULL,
11
12
  priority integer DEFAULT 0 NOT NULL,
@@ -18,15 +19,16 @@ CREATE TABLE app_jobs.scheduled_jobs (
18
19
  last_scheduled_id bigint,
19
20
  CHECK (length(key) < 513),
20
21
  CHECK (length(task_identifier) < 127),
21
- CHECK (max_attempts > 0),
22
+ CHECK (max_attempts >= 1),
22
23
  CHECK (length(queue_name) < 127),
23
24
  CHECK (length(locked_by) > 3),
24
25
  UNIQUE (key)
25
26
  );
26
27
 
27
- COMMENT ON TABLE app_jobs.scheduled_jobs IS 'Recurring/cron-style job definitions with database scoping: each row spawns jobs on a schedule for a specific database';
28
+ COMMENT ON TABLE app_jobs.scheduled_jobs IS 'Recurring/cron-style job definitions: each row spawns jobs on a schedule, optionally scoped to a database';
28
29
  COMMENT ON COLUMN app_jobs.scheduled_jobs.id IS 'Auto-incrementing scheduled job identifier';
29
- COMMENT ON COLUMN app_jobs.scheduled_jobs.database_id IS 'Database this scheduled job belongs to, for multi-tenant isolation';
30
+ COMMENT ON COLUMN app_jobs.scheduled_jobs.database_id IS 'Database this scheduled job belongs to (nullable for system-level schedules without tenant context)';
31
+ COMMENT ON COLUMN app_jobs.scheduled_jobs.actor_id IS 'User who created this scheduled job, read from JWT claims at creation time';
30
32
  COMMENT ON COLUMN app_jobs.scheduled_jobs.queue_name IS 'Name of the queue spawned jobs are placed into';
31
33
  COMMENT ON COLUMN app_jobs.scheduled_jobs.task_identifier IS 'Task type identifier for spawned jobs';
32
34
  COMMENT ON COLUMN app_jobs.scheduled_jobs.payload IS 'JSON payload passed to each spawned job';
@@ -34,7 +34,7 @@ BEGIN
34
34
  END IF;
35
35
  END LOOP;
36
36
  PERFORM
37
- app_jobs.add_job (jwt_private.current_database_id(), fn, app_jobs.json_build_object_apply (args));
37
+ app_jobs.add_job (fn, app_jobs.json_build_object_apply (args));
38
38
  IF (TG_OP = 'INSERT' OR TG_OP = 'UPDATE') THEN
39
39
  RETURN NEW;
40
40
  END IF;
@@ -8,12 +8,12 @@ CREATE FUNCTION app_jobs.tg_add_job_with_row ()
8
8
  BEGIN
9
9
  IF (TG_OP = 'INSERT' OR TG_OP = 'UPDATE') THEN
10
10
  PERFORM
11
- app_jobs.add_job (jwt_private.current_database_id(), TG_ARGV[0], to_json(NEW));
11
+ app_jobs.add_job (TG_ARGV[0], to_json(NEW));
12
12
  RETURN NEW;
13
13
  END IF;
14
14
  IF (TG_OP = 'DELETE') THEN
15
15
  PERFORM
16
- app_jobs.add_job (jwt_private.current_database_id(), TG_ARGV[0], to_json(OLD));
16
+ app_jobs.add_job (TG_ARGV[0], to_json(OLD));
17
17
  RETURN OLD;
18
18
  END IF;
19
19
  END;
@@ -9,12 +9,12 @@ CREATE FUNCTION app_jobs.tg_add_job_with_row_id ()
9
9
  BEGIN
10
10
  IF (TG_OP = 'INSERT' OR TG_OP = 'UPDATE') THEN
11
11
  PERFORM
12
- app_jobs.add_job (jwt_private.current_database_id(), tg_argv[0], json_build_object('id', NEW.id));
12
+ app_jobs.add_job (tg_argv[0], json_build_object('id', NEW.id));
13
13
  RETURN NEW;
14
14
  END IF;
15
15
  IF (TG_OP = 'DELETE') THEN
16
16
  PERFORM
17
- app_jobs.add_job (jwt_private.current_database_id(), tg_argv[0], json_build_object('id', OLD.id));
17
+ app_jobs.add_job (tg_argv[0], json_build_object('id', OLD.id));
18
18
  RETURN OLD;
19
19
  END IF;
20
20
  END;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pgpm/database-jobs",
3
- "version": "0.20.2",
3
+ "version": "0.21.2",
4
4
  "description": "Database-specific job handling and queue management",
5
5
  "author": "Dan Lynch <pyramation@gmail.com>",
6
6
  "contributors": [
@@ -21,10 +21,11 @@
21
21
  "test:watch": "jest --watch"
22
22
  },
23
23
  "devDependencies": {
24
- "pgpm": "^4.2.3"
24
+ "pgpm": "^4.16.6"
25
25
  },
26
26
  "dependencies": {
27
- "@pgpm/verify": "0.20.0"
27
+ "@pgpm/jwt-claims": "0.21.2",
28
+ "@pgpm/verify": "0.21.2"
28
29
  },
29
30
  "repository": {
30
31
  "type": "git",
@@ -34,5 +35,5 @@
34
35
  "bugs": {
35
36
  "url": "https://github.com/constructive-io/pgpm-modules/issues"
36
37
  },
37
- "gitHead": "109293dbfe8c205a9265ab36c8cb99efa5dcc1fb"
38
+ "gitHead": "c7d836c99c7ce519e9bb79e6343bee3741781766"
38
39
  }
@@ -1,8 +1,8 @@
1
1
  # pgpm-database-jobs extension
2
2
  comment = 'pgpm-database-jobs extension'
3
- default_version = '0.15.5'
3
+ default_version = '0.22.0'
4
4
  module_pathname = '$libdir/pgpm-database-jobs'
5
- requires = 'plpgsql,pgcrypto,pgpm-verify'
5
+ requires = 'plpgsql,pgcrypto,pgpm-verify,pgpm-jwt-claims'
6
6
  relocatable = false
7
7
  superuser = false
8
8
 
package/pgpm.plan CHANGED
@@ -34,5 +34,7 @@ schemas/app_jobs/procedures/get_job [schemas/app_jobs/schema schemas/app_jobs/ta
34
34
  schemas/app_jobs/procedures/fail_job [schemas/app_jobs/schema schemas/app_jobs/tables/jobs/table schemas/app_jobs/tables/job_queues/table] 2025-08-26T23:57:41Z pgpm <pgpm@5b0c196eeb62> # add schemas/app_jobs/procedures/fail_job
35
35
  schemas/app_jobs/procedures/complete_jobs [schemas/app_jobs/schema schemas/app_jobs/tables/job_queues/table schemas/app_jobs/tables/jobs/table] 2025-08-26T23:57:41Z pgpm <pgpm@5b0c196eeb62> # add schemas/app_jobs/procedures/complete_jobs
36
36
  schemas/app_jobs/procedures/complete_job [schemas/app_jobs/schema schemas/app_jobs/tables/jobs/table schemas/app_jobs/tables/job_queues/table] 2025-08-26T23:57:41Z pgpm <pgpm@5b0c196eeb62> # add schemas/app_jobs/procedures/complete_job
37
- schemas/app_jobs/procedures/add_scheduled_job [schemas/app_jobs/schema schemas/app_jobs/tables/scheduled_jobs/table] 2025-08-26T23:57:41Z pgpm <pgpm@5b0c196eeb62> # add schemas/app_jobs/procedures/add_scheduled_job
38
- schemas/app_jobs/procedures/add_job [schemas/app_jobs/schema schemas/app_jobs/tables/jobs/table schemas/app_jobs/tables/job_queues/table] 2025-08-26T23:57:41Z pgpm <pgpm@5b0c196eeb62> # add schemas/app_jobs/procedures/add_job
37
+ schemas/app_jobs/procedures/add_scheduled_job [schemas/app_jobs/schema schemas/app_jobs/tables/scheduled_jobs/table pgpm-jwt-claims:schemas/jwt_private/procedures/current_database_id] 2025-08-26T23:57:41Z pgpm <pgpm@5b0c196eeb62> # add schemas/app_jobs/procedures/add_scheduled_job
38
+ schemas/app_jobs/procedures/add_job [schemas/app_jobs/schema schemas/app_jobs/tables/jobs/table schemas/app_jobs/tables/job_queues/table pgpm-jwt-claims:schemas/jwt_private/procedures/current_database_id pgpm-jwt-claims:schemas/jwt_public/procedures/current_user_id] 2025-08-26T23:57:41Z pgpm <pgpm@5b0c196eeb62> # add schemas/app_jobs/procedures/add_job
39
+ schemas/app_jobs/procedures/remove_job [schemas/app_jobs/schema schemas/app_jobs/tables/jobs/table] 2025-08-26T23:57:41Z pgpm <pgpm@5b0c196eeb62> # add schemas/app_jobs/procedures/remove_job
40
+ schemas/app_jobs/procedures/force_unlock_workers [schemas/app_jobs/schema schemas/app_jobs/tables/jobs/table schemas/app_jobs/tables/job_queues/table] 2025-08-26T23:57:41Z pgpm <pgpm@5b0c196eeb62> # add schemas/app_jobs/procedures/force_unlock_workers
@@ -0,0 +1,7 @@
1
+ -- Revert schemas/app_jobs/procedures/force_unlock_workers from pg
2
+
3
+ BEGIN;
4
+
5
+ DROP FUNCTION app_jobs.force_unlock_workers;
6
+
7
+ COMMIT;
@@ -0,0 +1,7 @@
1
+ -- Revert schemas/app_jobs/procedures/remove_job from pg
2
+
3
+ BEGIN;
4
+
5
+ DROP FUNCTION app_jobs.remove_job;
6
+
7
+ COMMIT;
@@ -2,6 +2,8 @@
2
2
 
3
3
  BEGIN;
4
4
 
5
- DROP INDEX app_jobs.priority_run_at_id_idx;
5
+ DROP INDEX IF EXISTS app_jobs.priority_run_at_id_idx;
6
+ DROP INDEX IF EXISTS app_jobs.jobs_main_index;
7
+ DROP INDEX IF EXISTS app_jobs.jobs_no_queue_index;
6
8
 
7
9
  COMMIT;
@@ -1,5 +1,6 @@
1
1
  -- Revert schemas/app_jobs/tables/jobs/triggers/notify_worker from pg
2
2
  BEGIN;
3
- DROP TRIGGER _900_notify_worker ON app_jobs.jobs;
3
+ DROP TRIGGER IF EXISTS _900_notify_worker ON app_jobs.jobs;
4
+ DROP TRIGGER IF EXISTS _900_after_insert ON app_jobs.jobs;
5
+ DROP FUNCTION IF EXISTS app_jobs.tg_jobs__after_insert;
4
6
  COMMIT;
5
-
@@ -0,0 +1,7 @@
1
+ -- Verify schemas/app_jobs/procedures/force_unlock_workers on pg
2
+
3
+ BEGIN;
4
+
5
+ SELECT verify_function ('app_jobs.force_unlock_workers');
6
+
7
+ ROLLBACK;
@@ -0,0 +1,7 @@
1
+ -- Verify schemas/app_jobs/procedures/remove_job on pg
2
+
3
+ BEGIN;
4
+
5
+ SELECT verify_function ('app_jobs.remove_job');
6
+
7
+ ROLLBACK;
@@ -2,6 +2,7 @@
2
2
 
3
3
  BEGIN;
4
4
 
5
- SELECT verify_index ('app_jobs.jobs', 'priority_run_at_id_idx');
5
+ SELECT verify_index ('app_jobs.jobs', 'jobs_main_index');
6
+ SELECT verify_index ('app_jobs.jobs', 'jobs_no_queue_index');
6
7
 
7
8
  ROLLBACK;
@@ -1,6 +1,5 @@
1
1
  -- Verify schemas/app_jobs/tables/jobs/triggers/notify_worker on pg
2
2
  BEGIN;
3
3
  SELECT
4
- verify_trigger ('app_jobs._900_notify_worker');
4
+ verify_trigger ('app_jobs._900_after_insert');
5
5
  ROLLBACK;
6
-