hazo_notify 1.1.4 → 3.1.0
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/README.md +163 -41
- package/dist/components/template_manager/category_dialog.d.ts +11 -0
- package/dist/components/template_manager/category_dialog.d.ts.map +1 -0
- package/dist/components/template_manager/category_dialog.js +41 -0
- package/dist/components/template_manager/category_dialog.js.map +1 -0
- package/dist/components/template_manager/category_tree.d.ts +13 -0
- package/dist/components/template_manager/category_tree.d.ts.map +1 -0
- package/dist/components/template_manager/category_tree.js +45 -0
- package/dist/components/template_manager/category_tree.js.map +1 -0
- package/dist/components/template_manager/index.d.ts +10 -0
- package/dist/components/template_manager/index.d.ts.map +1 -0
- package/dist/components/template_manager/index.js +8 -0
- package/dist/components/template_manager/index.js.map +1 -0
- package/dist/components/template_manager/preview_dialog.d.ts +11 -0
- package/dist/components/template_manager/preview_dialog.d.ts.map +1 -0
- package/dist/components/template_manager/preview_dialog.js +15 -0
- package/dist/components/template_manager/preview_dialog.js.map +1 -0
- package/dist/components/template_manager/template_dialog.d.ts +12 -0
- package/dist/components/template_manager/template_dialog.d.ts.map +1 -0
- package/dist/components/template_manager/template_dialog.js +46 -0
- package/dist/components/template_manager/template_dialog.js.map +1 -0
- package/dist/components/template_manager/template_editor.d.ts +12 -0
- package/dist/components/template_manager/template_editor.d.ts.map +1 -0
- package/dist/components/template_manager/template_editor.js +57 -0
- package/dist/components/template_manager/template_editor.js.map +1 -0
- package/dist/components/template_manager/template_globals_admin.d.ts +8 -0
- package/dist/components/template_manager/template_globals_admin.d.ts.map +1 -0
- package/dist/components/template_manager/template_globals_admin.js +27 -0
- package/dist/components/template_manager/template_globals_admin.js.map +1 -0
- package/dist/components/template_manager/template_manager_admin.d.ts +44 -0
- package/dist/components/template_manager/template_manager_admin.d.ts.map +1 -0
- package/dist/components/template_manager/template_manager_admin.js +272 -0
- package/dist/components/template_manager/template_manager_admin.js.map +1 -0
- package/dist/lib/emailer/emailer.d.ts.map +1 -0
- package/dist/lib/emailer/emailer.js.map +1 -0
- package/dist/lib/emailer/index.d.ts.map +1 -0
- package/dist/lib/emailer/index.js.map +1 -0
- package/dist/lib/emailer/providers/index.d.ts.map +1 -0
- package/dist/lib/emailer/providers/index.js.map +1 -0
- package/dist/lib/emailer/providers/pop3_provider.d.ts.map +1 -0
- package/dist/lib/emailer/providers/pop3_provider.js.map +1 -0
- package/dist/lib/emailer/providers/smtp_provider.d.ts.map +1 -0
- package/dist/lib/emailer/providers/smtp_provider.js.map +1 -0
- package/dist/lib/emailer/providers/zeptomail_provider.d.ts.map +1 -0
- package/dist/{emailer → lib/emailer}/providers/zeptomail_provider.js +9 -6
- package/dist/lib/emailer/providers/zeptomail_provider.js.map +1 -0
- package/dist/lib/emailer/types.d.ts.map +1 -0
- package/dist/lib/emailer/types.js.map +1 -0
- package/dist/lib/emailer/utils/constants.d.ts.map +1 -0
- package/dist/lib/emailer/utils/constants.js.map +1 -0
- package/dist/lib/emailer/utils/index.d.ts.map +1 -0
- package/dist/lib/emailer/utils/index.js.map +1 -0
- package/dist/lib/emailer/utils/logger.d.ts.map +1 -0
- package/dist/lib/emailer/utils/logger.js.map +1 -0
- package/dist/lib/emailer/utils/validation.d.ts.map +1 -0
- package/dist/lib/emailer/utils/validation.js.map +1 -0
- package/dist/lib/index.d.ts.map +1 -0
- package/dist/lib/index.js.map +1 -0
- package/dist/lib/template_manager/cache/scope_chain_cache.d.ts +26 -0
- package/dist/lib/template_manager/cache/scope_chain_cache.d.ts.map +1 -0
- package/dist/lib/template_manager/cache/scope_chain_cache.js +60 -0
- package/dist/lib/template_manager/cache/scope_chain_cache.js.map +1 -0
- package/dist/{template_manager → lib/template_manager}/config/config_loader.d.ts +16 -15
- package/dist/lib/template_manager/config/config_loader.d.ts.map +1 -0
- package/dist/lib/template_manager/config/config_loader.js +98 -0
- package/dist/lib/template_manager/config/config_loader.js.map +1 -0
- package/dist/{template_manager → lib/template_manager}/config/constants.d.ts +4 -54
- package/dist/lib/template_manager/config/constants.d.ts.map +1 -0
- package/dist/{template_manager → lib/template_manager}/config/constants.js +4 -84
- package/dist/lib/template_manager/config/constants.js.map +1 -0
- package/dist/lib/template_manager/config/index.d.ts.map +1 -0
- package/dist/lib/template_manager/config/index.js.map +1 -0
- package/dist/{template_manager → lib/template_manager}/db/category_repository.d.ts +22 -14
- package/dist/lib/template_manager/db/category_repository.d.ts.map +1 -0
- package/dist/{template_manager → lib/template_manager}/db/category_repository.js +127 -83
- package/dist/lib/template_manager/db/category_repository.js.map +1 -0
- package/dist/lib/template_manager/db/index.d.ts +6 -0
- package/dist/lib/template_manager/db/index.d.ts.map +1 -0
- package/dist/lib/template_manager/db/index.js +6 -0
- package/dist/lib/template_manager/db/index.js.map +1 -0
- package/dist/{template_manager → lib/template_manager}/db/template_repository.d.ts +25 -28
- package/dist/lib/template_manager/db/template_repository.d.ts.map +1 -0
- package/dist/lib/template_manager/db/template_repository.js +507 -0
- package/dist/lib/template_manager/db/template_repository.js.map +1 -0
- package/dist/lib/template_manager/engine/handlebars_engine.d.ts.map +1 -0
- package/dist/lib/template_manager/engine/handlebars_engine.js.map +1 -0
- package/dist/lib/template_manager/engine/index.d.ts.map +1 -0
- package/dist/lib/template_manager/engine/index.js.map +1 -0
- package/dist/{template_manager → lib/template_manager}/engine/variable_resolver.d.ts +13 -14
- package/dist/lib/template_manager/engine/variable_resolver.d.ts.map +1 -0
- package/dist/{template_manager → lib/template_manager}/engine/variable_resolver.js +25 -33
- package/dist/lib/template_manager/engine/variable_resolver.js.map +1 -0
- package/dist/lib/template_manager/handlers/adapters/hazo_auth.d.ts +20 -0
- package/dist/lib/template_manager/handlers/adapters/hazo_auth.d.ts.map +1 -0
- package/dist/lib/template_manager/handlers/adapters/hazo_auth.js +46 -0
- package/dist/lib/template_manager/handlers/adapters/hazo_auth.js.map +1 -0
- package/dist/lib/template_manager/handlers/auth.d.ts +47 -0
- package/dist/lib/template_manager/handlers/auth.d.ts.map +1 -0
- package/dist/lib/template_manager/handlers/auth.js +67 -0
- package/dist/lib/template_manager/handlers/auth.js.map +1 -0
- package/dist/lib/template_manager/handlers/index.d.ts +67 -0
- package/dist/lib/template_manager/handlers/index.d.ts.map +1 -0
- package/dist/lib/template_manager/handlers/index.js +284 -0
- package/dist/lib/template_manager/handlers/index.js.map +1 -0
- package/dist/lib/template_manager/index.d.ts +56 -0
- package/dist/lib/template_manager/index.d.ts.map +1 -0
- package/dist/lib/template_manager/index.js +68 -0
- package/dist/lib/template_manager/index.js.map +1 -0
- package/dist/lib/template_manager/init.d.ts +54 -0
- package/dist/lib/template_manager/init.d.ts.map +1 -0
- package/dist/lib/template_manager/init.js +85 -0
- package/dist/lib/template_manager/init.js.map +1 -0
- package/dist/lib/template_manager/registry.d.ts +23 -0
- package/dist/lib/template_manager/registry.d.ts.map +1 -0
- package/dist/lib/template_manager/registry.js +33 -0
- package/dist/lib/template_manager/registry.js.map +1 -0
- package/dist/lib/template_manager/seed/sync.d.ts +8 -0
- package/dist/lib/template_manager/seed/sync.d.ts.map +1 -0
- package/dist/lib/template_manager/seed/sync.js +77 -0
- package/dist/lib/template_manager/seed/sync.js.map +1 -0
- package/dist/{template_manager → lib/template_manager}/template_manager.d.ts +25 -27
- package/dist/lib/template_manager/template_manager.d.ts.map +1 -0
- package/dist/{template_manager → lib/template_manager}/template_manager.js +41 -55
- package/dist/lib/template_manager/template_manager.js.map +1 -0
- package/dist/{template_manager → lib/template_manager}/types.d.ts +32 -125
- package/dist/lib/template_manager/types.d.ts.map +1 -0
- package/dist/lib/template_manager/types.js +12 -0
- package/dist/lib/template_manager/types.js.map +1 -0
- package/dist/lib/template_manager/utils/index.d.ts.map +1 -0
- package/dist/lib/template_manager/utils/index.js.map +1 -0
- package/dist/lib/template_manager/utils/system_variables.d.ts.map +1 -0
- package/dist/lib/template_manager/utils/system_variables.js.map +1 -0
- package/dist/lib/template_manager/utils/validation.d.ts.map +1 -0
- package/dist/lib/template_manager/utils/validation.js.map +1 -0
- package/dist/lib/utils.d.ts +3 -0
- package/dist/lib/utils.d.ts.map +1 -0
- package/dist/lib/utils.js +6 -0
- package/dist/lib/utils.js.map +1 -0
- package/migrations/002_scope_migration.sql +93 -0
- package/package.json +65 -37
- package/dist/emailer/emailer.d.ts.map +0 -1
- package/dist/emailer/emailer.js.map +0 -1
- package/dist/emailer/index.d.ts.map +0 -1
- package/dist/emailer/index.js.map +0 -1
- package/dist/emailer/providers/index.d.ts.map +0 -1
- package/dist/emailer/providers/index.js.map +0 -1
- package/dist/emailer/providers/pop3_provider.d.ts.map +0 -1
- package/dist/emailer/providers/pop3_provider.js.map +0 -1
- package/dist/emailer/providers/smtp_provider.d.ts.map +0 -1
- package/dist/emailer/providers/smtp_provider.js.map +0 -1
- package/dist/emailer/providers/zeptomail_provider.d.ts.map +0 -1
- package/dist/emailer/providers/zeptomail_provider.js.map +0 -1
- package/dist/emailer/types.d.ts.map +0 -1
- package/dist/emailer/types.js.map +0 -1
- package/dist/emailer/utils/constants.d.ts.map +0 -1
- package/dist/emailer/utils/constants.js.map +0 -1
- package/dist/emailer/utils/index.d.ts.map +0 -1
- package/dist/emailer/utils/index.js.map +0 -1
- package/dist/emailer/utils/logger.d.ts.map +0 -1
- package/dist/emailer/utils/logger.js.map +0 -1
- package/dist/emailer/utils/validation.d.ts.map +0 -1
- package/dist/emailer/utils/validation.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/template_manager/config/config_loader.d.ts.map +0 -1
- package/dist/template_manager/config/config_loader.js +0 -154
- package/dist/template_manager/config/config_loader.js.map +0 -1
- package/dist/template_manager/config/constants.d.ts.map +0 -1
- package/dist/template_manager/config/constants.js.map +0 -1
- package/dist/template_manager/config/index.d.ts.map +0 -1
- package/dist/template_manager/config/index.js.map +0 -1
- package/dist/template_manager/db/category_repository.d.ts.map +0 -1
- package/dist/template_manager/db/category_repository.js.map +0 -1
- package/dist/template_manager/db/index.d.ts +0 -6
- package/dist/template_manager/db/index.d.ts.map +0 -1
- package/dist/template_manager/db/index.js +0 -6
- package/dist/template_manager/db/index.js.map +0 -1
- package/dist/template_manager/db/template_repository.d.ts.map +0 -1
- package/dist/template_manager/db/template_repository.js +0 -674
- package/dist/template_manager/db/template_repository.js.map +0 -1
- package/dist/template_manager/engine/handlebars_engine.d.ts.map +0 -1
- package/dist/template_manager/engine/handlebars_engine.js.map +0 -1
- package/dist/template_manager/engine/index.d.ts.map +0 -1
- package/dist/template_manager/engine/index.js.map +0 -1
- package/dist/template_manager/engine/variable_resolver.d.ts.map +0 -1
- package/dist/template_manager/engine/variable_resolver.js.map +0 -1
- package/dist/template_manager/index.d.ts +0 -32
- package/dist/template_manager/index.d.ts.map +0 -1
- package/dist/template_manager/index.js +0 -41
- package/dist/template_manager/index.js.map +0 -1
- package/dist/template_manager/template_manager.d.ts.map +0 -1
- package/dist/template_manager/template_manager.js.map +0 -1
- package/dist/template_manager/types.d.ts.map +0 -1
- package/dist/template_manager/types.js +0 -11
- package/dist/template_manager/types.js.map +0 -1
- package/dist/template_manager/utils/index.d.ts.map +0 -1
- package/dist/template_manager/utils/index.js.map +0 -1
- package/dist/template_manager/utils/system_variables.d.ts.map +0 -1
- package/dist/template_manager/utils/system_variables.js.map +0 -1
- package/dist/template_manager/utils/validation.d.ts.map +0 -1
- package/dist/template_manager/utils/validation.js.map +0 -1
- /package/dist/{emailer → lib/emailer}/emailer.d.ts +0 -0
- /package/dist/{emailer → lib/emailer}/emailer.js +0 -0
- /package/dist/{emailer → lib/emailer}/index.d.ts +0 -0
- /package/dist/{emailer → lib/emailer}/index.js +0 -0
- /package/dist/{emailer → lib/emailer}/providers/index.d.ts +0 -0
- /package/dist/{emailer → lib/emailer}/providers/index.js +0 -0
- /package/dist/{emailer → lib/emailer}/providers/pop3_provider.d.ts +0 -0
- /package/dist/{emailer → lib/emailer}/providers/pop3_provider.js +0 -0
- /package/dist/{emailer → lib/emailer}/providers/smtp_provider.d.ts +0 -0
- /package/dist/{emailer → lib/emailer}/providers/smtp_provider.js +0 -0
- /package/dist/{emailer → lib/emailer}/providers/zeptomail_provider.d.ts +0 -0
- /package/dist/{emailer → lib/emailer}/types.d.ts +0 -0
- /package/dist/{emailer → lib/emailer}/types.js +0 -0
- /package/dist/{emailer → lib/emailer}/utils/constants.d.ts +0 -0
- /package/dist/{emailer → lib/emailer}/utils/constants.js +0 -0
- /package/dist/{emailer → lib/emailer}/utils/index.d.ts +0 -0
- /package/dist/{emailer → lib/emailer}/utils/index.js +0 -0
- /package/dist/{emailer → lib/emailer}/utils/logger.d.ts +0 -0
- /package/dist/{emailer → lib/emailer}/utils/logger.js +0 -0
- /package/dist/{emailer → lib/emailer}/utils/validation.d.ts +0 -0
- /package/dist/{emailer → lib/emailer}/utils/validation.js +0 -0
- /package/dist/{index.d.ts → lib/index.d.ts} +0 -0
- /package/dist/{index.js → lib/index.js} +0 -0
- /package/dist/{template_manager → lib/template_manager}/config/index.d.ts +0 -0
- /package/dist/{template_manager → lib/template_manager}/config/index.js +0 -0
- /package/dist/{template_manager → lib/template_manager}/engine/handlebars_engine.d.ts +0 -0
- /package/dist/{template_manager → lib/template_manager}/engine/handlebars_engine.js +0 -0
- /package/dist/{template_manager → lib/template_manager}/engine/index.d.ts +0 -0
- /package/dist/{template_manager → lib/template_manager}/engine/index.js +0 -0
- /package/dist/{template_manager → lib/template_manager}/utils/index.d.ts +0 -0
- /package/dist/{template_manager → lib/template_manager}/utils/index.js +0 -0
- /package/dist/{template_manager → lib/template_manager}/utils/system_variables.d.ts +0 -0
- /package/dist/{template_manager → lib/template_manager}/utils/system_variables.js +0 -0
- /package/dist/{template_manager → lib/template_manager}/utils/validation.d.ts +0 -0
- /package/dist/{template_manager → lib/template_manager}/utils/validation.js +0 -0
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Variable resolver for template manager
|
|
2
|
+
* Variable resolver for template manager (v2.0.0)
|
|
3
3
|
*
|
|
4
|
-
* Resolves user variables, system variables, and @template references
|
|
4
|
+
* Resolves user variables, system variables, and @template references.
|
|
5
|
+
* Uses scope_chain (hierarchical scope resolution) instead of org_id.
|
|
5
6
|
*/
|
|
6
7
|
import { TEMPLATE_REFERENCE_PATTERN, MAX_TEMPLATE_REFERENCE_DEPTH, ERROR_MESSAGES, } from '../config/constants.js';
|
|
7
8
|
import { resolve_system_variables } from '../utils/system_variables.js';
|
|
8
9
|
import { get_template_by_name } from '../db/template_repository.js';
|
|
9
10
|
import { render_handlebars_string } from './handlebars_engine.js';
|
|
10
11
|
/**
|
|
11
|
-
* Merge user variables with system variables
|
|
12
|
-
*
|
|
13
|
-
* System variables take lower priority than user variables
|
|
12
|
+
* Merge user variables with system variables.
|
|
13
|
+
* System variables take lower priority than user variables.
|
|
14
14
|
*
|
|
15
15
|
* @param user_variables - Variables provided by user
|
|
16
16
|
* @returns Merged variables with system variables
|
|
@@ -23,7 +23,7 @@ export function resolve_variables(user_variables) {
|
|
|
23
23
|
};
|
|
24
24
|
}
|
|
25
25
|
/**
|
|
26
|
-
* Extract @template references from content
|
|
26
|
+
* Extract @template references from content.
|
|
27
27
|
*
|
|
28
28
|
* @param content - Template content to scan
|
|
29
29
|
* @returns Array of template names referenced
|
|
@@ -42,21 +42,19 @@ export function extract_template_references(content) {
|
|
|
42
42
|
return Array.from(references);
|
|
43
43
|
}
|
|
44
44
|
/**
|
|
45
|
-
* Resolve @template references in content
|
|
46
|
-
*
|
|
47
|
-
* Recursively fetches and renders referenced templates
|
|
45
|
+
* Resolve @template references in HTML content.
|
|
46
|
+
* Recursively fetches and renders referenced templates using the scope_chain.
|
|
48
47
|
*
|
|
49
48
|
* @param content - Template content with @references
|
|
50
49
|
* @param variables - Variables to use for rendering
|
|
51
50
|
* @param hazo_connect - Database connection
|
|
52
|
-
* @param
|
|
51
|
+
* @param scope_chain - Ordered scope chain, deepest first (see get_template_by_name)
|
|
53
52
|
* @param visited - Set of already visited templates (for circular detection)
|
|
54
53
|
* @param depth - Current recursion depth
|
|
55
54
|
* @returns Resolved content with references replaced
|
|
56
55
|
*/
|
|
57
|
-
export async function resolve_template_references(content, variables, hazo_connect,
|
|
56
|
+
export async function resolve_template_references(content, variables, hazo_connect, scope_chain, visited = new Set(), depth = 0) {
|
|
58
57
|
try {
|
|
59
|
-
// Check max depth
|
|
60
58
|
if (depth > MAX_TEMPLATE_REFERENCE_DEPTH) {
|
|
61
59
|
return {
|
|
62
60
|
success: false,
|
|
@@ -74,7 +72,6 @@ export async function resolve_template_references(content, variables, hazo_conne
|
|
|
74
72
|
}
|
|
75
73
|
let resolved_content = content;
|
|
76
74
|
for (const ref_name of references) {
|
|
77
|
-
// Check for circular reference
|
|
78
75
|
if (visited.has(ref_name)) {
|
|
79
76
|
return {
|
|
80
77
|
success: false,
|
|
@@ -82,22 +79,18 @@ export async function resolve_template_references(content, variables, hazo_conne
|
|
|
82
79
|
message: `Circular reference detected: ${ref_name}`,
|
|
83
80
|
};
|
|
84
81
|
}
|
|
85
|
-
|
|
86
|
-
const template_result = await get_template_by_name(hazo_connect, org_id, ref_name);
|
|
82
|
+
const template_result = await get_template_by_name(hazo_connect, scope_chain, ref_name);
|
|
87
83
|
if (!template_result.success || !template_result.data) {
|
|
88
|
-
// Template not found
|
|
84
|
+
// Template not found — leave reference as-is
|
|
89
85
|
continue;
|
|
90
86
|
}
|
|
91
87
|
const template = template_result.data;
|
|
92
88
|
visited.add(ref_name);
|
|
93
|
-
|
|
94
|
-
const nested_result = await resolve_template_references(template.template_html, variables, hazo_connect, org_id, new Set(visited), depth + 1);
|
|
89
|
+
const nested_result = await resolve_template_references(template.template_html, variables, hazo_connect, scope_chain, new Set(visited), depth + 1);
|
|
95
90
|
if (!nested_result.success) {
|
|
96
91
|
return nested_result;
|
|
97
92
|
}
|
|
98
|
-
// Render the fetched template with variables
|
|
99
93
|
const rendered_ref = render_handlebars_string(nested_result.rendered_html || template.template_html, variables);
|
|
100
|
-
// Replace the @reference with rendered content
|
|
101
94
|
const ref_pattern = new RegExp(`@${ref_name}\\b`, 'g');
|
|
102
95
|
resolved_content = resolved_content.replace(ref_pattern, rendered_ref);
|
|
103
96
|
}
|
|
@@ -117,24 +110,24 @@ export async function resolve_template_references(content, variables, hazo_conne
|
|
|
117
110
|
}
|
|
118
111
|
}
|
|
119
112
|
/**
|
|
120
|
-
* Resolve @template references for both HTML and text content
|
|
113
|
+
* Resolve @template references for both HTML and text content.
|
|
121
114
|
*
|
|
122
115
|
* @param html_content - HTML template content
|
|
123
116
|
* @param text_content - Text template content
|
|
124
117
|
* @param variables - Variables for rendering
|
|
125
118
|
* @param hazo_connect - Database connection
|
|
126
|
-
* @param
|
|
119
|
+
* @param scope_chain - Ordered scope chain, deepest first
|
|
127
120
|
* @returns Resolved HTML and text content
|
|
128
121
|
*/
|
|
129
|
-
export async function resolve_all_template_references(html_content, text_content, variables, hazo_connect,
|
|
122
|
+
export async function resolve_all_template_references(html_content, text_content, variables, hazo_connect, scope_chain) {
|
|
130
123
|
try {
|
|
131
|
-
|
|
132
|
-
|
|
124
|
+
const [html_result, text_result] = await Promise.all([
|
|
125
|
+
resolve_template_references(html_content, variables, hazo_connect, scope_chain),
|
|
126
|
+
resolve_text_template_references(text_content, variables, hazo_connect, scope_chain),
|
|
127
|
+
]);
|
|
133
128
|
if (!html_result.success) {
|
|
134
129
|
return html_result;
|
|
135
130
|
}
|
|
136
|
-
// Resolve text references (fetch text version of templates)
|
|
137
|
-
const text_result = await resolve_text_template_references(text_content, variables, hazo_connect, org_id);
|
|
138
131
|
if (!text_result.success) {
|
|
139
132
|
return text_result;
|
|
140
133
|
}
|
|
@@ -155,10 +148,10 @@ export async function resolve_all_template_references(html_content, text_content
|
|
|
155
148
|
}
|
|
156
149
|
}
|
|
157
150
|
/**
|
|
158
|
-
* Resolve @template references in text content
|
|
159
|
-
* Uses template_text instead of template_html
|
|
151
|
+
* Resolve @template references in text content.
|
|
152
|
+
* Uses template_text instead of template_html.
|
|
160
153
|
*/
|
|
161
|
-
async function resolve_text_template_references(content, variables, hazo_connect,
|
|
154
|
+
async function resolve_text_template_references(content, variables, hazo_connect, scope_chain, visited = new Set(), depth = 0) {
|
|
162
155
|
try {
|
|
163
156
|
if (depth > MAX_TEMPLATE_REFERENCE_DEPTH) {
|
|
164
157
|
return {
|
|
@@ -184,14 +177,13 @@ async function resolve_text_template_references(content, variables, hazo_connect
|
|
|
184
177
|
message: `Circular reference detected: ${ref_name}`,
|
|
185
178
|
};
|
|
186
179
|
}
|
|
187
|
-
const template_result = await get_template_by_name(hazo_connect,
|
|
180
|
+
const template_result = await get_template_by_name(hazo_connect, scope_chain, ref_name);
|
|
188
181
|
if (!template_result.success || !template_result.data) {
|
|
189
182
|
continue;
|
|
190
183
|
}
|
|
191
184
|
const template = template_result.data;
|
|
192
185
|
visited.add(ref_name);
|
|
193
|
-
|
|
194
|
-
const nested_result = await resolve_text_template_references(template.template_text, variables, hazo_connect, org_id, new Set(visited), depth + 1);
|
|
186
|
+
const nested_result = await resolve_text_template_references(template.template_text, variables, hazo_connect, scope_chain, new Set(visited), depth + 1);
|
|
195
187
|
if (!nested_result.success) {
|
|
196
188
|
return nested_result;
|
|
197
189
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"variable_resolver.js","sourceRoot":"","sources":["../../../../src/lib/template_manager/engine/variable_resolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Convenience adapter wiring hazo_auth's `hazo_get_tenant_auth` into the
|
|
3
|
+
* template-manager auth wrapper.
|
|
4
|
+
*
|
|
5
|
+
* hazo_auth is dynamic-imported so it stays an OPTIONAL peer dependency of
|
|
6
|
+
* hazo_notify — apps that authenticate differently can implement
|
|
7
|
+
* `TemplateManagerAuthAdapter` themselves without installing hazo_auth.
|
|
8
|
+
*/
|
|
9
|
+
import 'server-only';
|
|
10
|
+
import type { TemplateManagerAuthAdapter } from '../auth.js';
|
|
11
|
+
export interface CreateHazoAuthAdapterOptions {
|
|
12
|
+
scoped_permission?: string;
|
|
13
|
+
global_permission?: string;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Resolve the hazo_auth adapter. Throws a clear error if hazo_auth is not
|
|
17
|
+
* installed in the consuming app.
|
|
18
|
+
*/
|
|
19
|
+
export declare function create_hazo_auth_adapter(options?: CreateHazoAuthAdapterOptions): Promise<TemplateManagerAuthAdapter>;
|
|
20
|
+
//# sourceMappingURL=hazo_auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hazo_auth.d.ts","sourceRoot":"","sources":["../../../../../src/lib/template_manager/handlers/adapters/hazo_auth.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,aAAa,CAAC;AAErB,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,YAAY,CAAC;AAE7D,MAAM,WAAW,4BAA4B;IAC3C,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAWD;;;GAGG;AACH,wBAAsB,wBAAwB,CAC5C,OAAO,CAAC,EAAE,4BAA4B,GACrC,OAAO,CAAC,0BAA0B,CAAC,CAiCrC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Convenience adapter wiring hazo_auth's `hazo_get_tenant_auth` into the
|
|
3
|
+
* template-manager auth wrapper.
|
|
4
|
+
*
|
|
5
|
+
* hazo_auth is dynamic-imported so it stays an OPTIONAL peer dependency of
|
|
6
|
+
* hazo_notify — apps that authenticate differently can implement
|
|
7
|
+
* `TemplateManagerAuthAdapter` themselves without installing hazo_auth.
|
|
8
|
+
*/
|
|
9
|
+
import 'server-only';
|
|
10
|
+
// hazo_auth re-exports template_manager types from hazo_notify itself. Resolving
|
|
11
|
+
// the import path statically would make tsc follow that chain back through the
|
|
12
|
+
// workspace symlink to this package's own dist/.d.ts files, triggering TS5055
|
|
13
|
+
// "would overwrite input file" errors on every rebuild after the first. We
|
|
14
|
+
// defeat constant-folding by passing the spec through a variable that's only
|
|
15
|
+
// computed at runtime — tsc treats it as `Promise<any>` and never resolves the
|
|
16
|
+
// types, while Node still imports it normally at the consumer site.
|
|
17
|
+
const HAZO_AUTH_PKG = ['hazo_auth', 'server-lib'].join('/');
|
|
18
|
+
/**
|
|
19
|
+
* Resolve the hazo_auth adapter. Throws a clear error if hazo_auth is not
|
|
20
|
+
* installed in the consuming app.
|
|
21
|
+
*/
|
|
22
|
+
export async function create_hazo_auth_adapter(options) {
|
|
23
|
+
let mod;
|
|
24
|
+
try {
|
|
25
|
+
mod = (await import(HAZO_AUTH_PKG));
|
|
26
|
+
}
|
|
27
|
+
catch (err) {
|
|
28
|
+
throw new Error("hazo_notify/template_manager_handlers/hazo_auth requires the optional peer 'hazo_auth' to be installed. Install it or supply a custom TemplateManagerAuthAdapter.");
|
|
29
|
+
}
|
|
30
|
+
const hazo_get_tenant_auth = mod.hazo_get_tenant_auth;
|
|
31
|
+
return {
|
|
32
|
+
scoped_permission: options?.scoped_permission ?? 'notify_templates_admin',
|
|
33
|
+
global_permission: options?.global_permission ?? 'notify_templates_super_admin',
|
|
34
|
+
resolve: async (request, required_permission) => {
|
|
35
|
+
const r = (await hazo_get_tenant_auth(request, {
|
|
36
|
+
required_permissions: [required_permission],
|
|
37
|
+
}));
|
|
38
|
+
return {
|
|
39
|
+
authenticated: r.authenticated,
|
|
40
|
+
permission_ok: r.permission_ok,
|
|
41
|
+
organization_id: r.organization_id ?? null,
|
|
42
|
+
};
|
|
43
|
+
},
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=hazo_auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hazo_auth.js","sourceRoot":"","sources":["../../../../../src/lib/template_manager/handlers/adapters/hazo_auth.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,aAAa,CAAC;AASrB,iFAAiF;AACjF,+EAA+E;AAC/E,8EAA8E;AAC9E,2EAA2E;AAC3E,6EAA6E;AAC7E,+EAA+E;AAC/E,oEAAoE;AACpE,MAAM,aAAa,GAAG,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAE5D;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,OAAsC;IAEtC,IAAI,GAAuE,CAAC;IAC5E,IAAI,CAAC;QACH,GAAG,GAAG,CAAC,MAAM,MAAM,CAAC,aAAa,CAAC,CAEjC,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CACb,mKAAmK,CACpK,CAAC;IACJ,CAAC;IAED,MAAM,oBAAoB,GAAG,GAAG,CAAC,oBAAoB,CAAC;IAEtD,OAAO;QACL,iBAAiB,EAAE,OAAO,EAAE,iBAAiB,IAAI,wBAAwB;QACzE,iBAAiB,EACf,OAAO,EAAE,iBAAiB,IAAI,8BAA8B;QAC9D,OAAO,EAAE,KAAK,EAAE,OAAoB,EAAE,mBAA2B,EAAE,EAAE;YACnE,MAAM,CAAC,GAAG,CAAC,MAAM,oBAAoB,CAAC,OAAO,EAAE;gBAC7C,oBAAoB,EAAE,CAAC,mBAAmB,CAAC;aAC5C,CAAC,CAID,CAAC;YACF,OAAO;gBACL,aAAa,EAAE,CAAC,CAAC,aAAa;gBAC9B,aAAa,EAAE,CAAC,CAAC,aAAa;gBAC9B,eAAe,EAAE,CAAC,CAAC,eAAe,IAAI,IAAI;aAC3C,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pluggable auth wrapper for the template-manager admin route handlers.
|
|
3
|
+
*
|
|
4
|
+
* The wrapper resolves whether the request is in "global" view (`?view=global`)
|
|
5
|
+
* or scoped (per-tenant), checks the matching permission via the supplied
|
|
6
|
+
* `TemplateManagerAuthAdapter`, and on success calls the wrapped handler with
|
|
7
|
+
* `{ scope_id, is_global }` and any URL params.
|
|
8
|
+
*
|
|
9
|
+
* hazo_notify intentionally has NO direct dependency on hazo_auth — consumers
|
|
10
|
+
* supply an adapter. A convenience adapter for hazo_auth ships at
|
|
11
|
+
* `hazo_notify/template_manager_handlers/hazo_auth` (dynamic-imported, so
|
|
12
|
+
* apps that don't use hazo_auth aren't forced to install it).
|
|
13
|
+
*/
|
|
14
|
+
import 'server-only';
|
|
15
|
+
import { NextRequest, NextResponse } from 'next/server';
|
|
16
|
+
export interface TemplateManagerAuth {
|
|
17
|
+
scope_id: string | null;
|
|
18
|
+
is_global: boolean;
|
|
19
|
+
}
|
|
20
|
+
export interface TemplateManagerAuthAdapterResult {
|
|
21
|
+
authenticated: boolean;
|
|
22
|
+
permission_ok: boolean;
|
|
23
|
+
organization_id?: string | null;
|
|
24
|
+
}
|
|
25
|
+
export interface TemplateManagerAuthAdapter {
|
|
26
|
+
/**
|
|
27
|
+
* Resolve auth for the request against the named permission. Mirrors the
|
|
28
|
+
* shape of hazo_auth's `hazo_get_tenant_auth`.
|
|
29
|
+
*/
|
|
30
|
+
resolve: (request: NextRequest, required_permission: string) => Promise<TemplateManagerAuthAdapterResult>;
|
|
31
|
+
/** Permission required for scoped (per-tenant) admin. */
|
|
32
|
+
scoped_permission: string;
|
|
33
|
+
/** Permission required for global (super-admin) admin. */
|
|
34
|
+
global_permission: string;
|
|
35
|
+
}
|
|
36
|
+
export type TemplateManagerHandler<P = Record<string, never>> = (request: NextRequest, auth: TemplateManagerAuth, params: P) => Promise<NextResponse>;
|
|
37
|
+
interface RouteContext<P> {
|
|
38
|
+
params: P | Promise<P>;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Build a `with_template_auth` higher-order handler bound to the supplied
|
|
42
|
+
* adapter and CORS headers. The returned function wraps a route handler
|
|
43
|
+
* with auth, scope resolution and consistent error responses.
|
|
44
|
+
*/
|
|
45
|
+
export declare function create_with_template_auth(adapter: TemplateManagerAuthAdapter, cors_headers?: HeadersInit): <P = Record<string, never>>(handler: TemplateManagerHandler<P>) => (request: NextRequest, context?: RouteContext<P>) => Promise<NextResponse>;
|
|
46
|
+
export {};
|
|
47
|
+
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../../src/lib/template_manager/handlers/auth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,aAAa,CAAC;AACrB,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAExD,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,gCAAgC;IAC/C,aAAa,EAAE,OAAO,CAAC;IACvB,aAAa,EAAE,OAAO,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACjC;AAED,MAAM,WAAW,0BAA0B;IACzC;;;OAGG;IACH,OAAO,EAAE,CACP,OAAO,EAAE,WAAW,EACpB,mBAAmB,EAAE,MAAM,KACxB,OAAO,CAAC,gCAAgC,CAAC,CAAC;IAC/C,yDAAyD;IACzD,iBAAiB,EAAE,MAAM,CAAC;IAC1B,0DAA0D;IAC1D,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,MAAM,sBAAsB,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAC9D,OAAO,EAAE,WAAW,EACpB,IAAI,EAAE,mBAAmB,EACzB,MAAM,EAAE,CAAC,KACN,OAAO,CAAC,YAAY,CAAC,CAAC;AAE3B,UAAU,YAAY,CAAC,CAAC;IACtB,MAAM,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;CACxB;AAgBD;;;;GAIG;AACH,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,0BAA0B,EACnC,YAAY,GAAE,WAAgB,IAKK,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,EAC1D,SAAS,sBAAsB,CAAC,CAAC,CAAC,MAGhC,SAAS,WAAW,EACpB,UAAU,YAAY,CAAC,CAAC,CAAC,KACxB,OAAO,CAAC,YAAY,CAAC,CAoC3B"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pluggable auth wrapper for the template-manager admin route handlers.
|
|
3
|
+
*
|
|
4
|
+
* The wrapper resolves whether the request is in "global" view (`?view=global`)
|
|
5
|
+
* or scoped (per-tenant), checks the matching permission via the supplied
|
|
6
|
+
* `TemplateManagerAuthAdapter`, and on success calls the wrapped handler with
|
|
7
|
+
* `{ scope_id, is_global }` and any URL params.
|
|
8
|
+
*
|
|
9
|
+
* hazo_notify intentionally has NO direct dependency on hazo_auth — consumers
|
|
10
|
+
* supply an adapter. A convenience adapter for hazo_auth ships at
|
|
11
|
+
* `hazo_notify/template_manager_handlers/hazo_auth` (dynamic-imported, so
|
|
12
|
+
* apps that don't use hazo_auth aren't forced to install it).
|
|
13
|
+
*/
|
|
14
|
+
import 'server-only';
|
|
15
|
+
import { NextResponse } from 'next/server';
|
|
16
|
+
async function resolve_params(context) {
|
|
17
|
+
if (!context)
|
|
18
|
+
return {};
|
|
19
|
+
const p = context.params;
|
|
20
|
+
return (p && typeof p.then === 'function'
|
|
21
|
+
? await p
|
|
22
|
+
: p);
|
|
23
|
+
}
|
|
24
|
+
function is_global_view(request) {
|
|
25
|
+
return new URL(request.url).searchParams.get('view') === 'global';
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Build a `with_template_auth` higher-order handler bound to the supplied
|
|
29
|
+
* adapter and CORS headers. The returned function wraps a route handler
|
|
30
|
+
* with auth, scope resolution and consistent error responses.
|
|
31
|
+
*/
|
|
32
|
+
export function create_with_template_auth(adapter, cors_headers = {}) {
|
|
33
|
+
const unauth = (status, body) => NextResponse.json(body, { status, headers: cors_headers });
|
|
34
|
+
return function with_template_auth(handler) {
|
|
35
|
+
return async (request, context) => {
|
|
36
|
+
const params = await resolve_params(context);
|
|
37
|
+
const is_global = is_global_view(request);
|
|
38
|
+
const required = is_global
|
|
39
|
+
? adapter.global_permission
|
|
40
|
+
: adapter.scoped_permission;
|
|
41
|
+
const auth_result = await adapter.resolve(request, required);
|
|
42
|
+
if (!auth_result.authenticated) {
|
|
43
|
+
return unauth(401, {
|
|
44
|
+
error: 'Authentication required',
|
|
45
|
+
code: 'UNAUTHENTICATED',
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
if (!auth_result.permission_ok) {
|
|
49
|
+
return unauth(403, {
|
|
50
|
+
error: 'Insufficient permissions',
|
|
51
|
+
code: 'FORBIDDEN',
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
const scope_id = is_global
|
|
55
|
+
? null
|
|
56
|
+
: auth_result.organization_id ?? null;
|
|
57
|
+
if (!is_global && !scope_id) {
|
|
58
|
+
return unauth(403, {
|
|
59
|
+
error: 'Organization context required',
|
|
60
|
+
code: 'TENANT_REQUIRED',
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
return handler(request, { scope_id, is_global }, params);
|
|
64
|
+
};
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../../src/lib/template_manager/handlers/auth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,aAAa,CAAC;AACrB,OAAO,EAAe,YAAY,EAAE,MAAM,aAAa,CAAC;AAsCxD,KAAK,UAAU,cAAc,CAC3B,OAAoC;IAEpC,IAAI,CAAC,OAAO;QAAE,OAAO,EAAO,CAAC;IAC7B,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IACzB,OAAO,CAAC,CAAC,IAAI,OAAQ,CAAgB,CAAC,IAAI,KAAK,UAAU;QACvD,CAAC,CAAC,MAAM,CAAC;QACT,CAAC,CAAC,CAAC,CAAM,CAAC;AACd,CAAC;AAED,SAAS,cAAc,CAAC,OAAoB;IAC1C,OAAO,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,QAAQ,CAAC;AACpE,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,yBAAyB,CACvC,OAAmC,EACnC,eAA4B,EAAE;IAE9B,MAAM,MAAM,GAAG,CAAC,MAAc,EAAE,IAA6B,EAAE,EAAE,CAC/D,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC,CAAC;IAE7D,OAAO,SAAS,kBAAkB,CAChC,OAAkC;QAElC,OAAO,KAAK,EACV,OAAoB,EACpB,OAAyB,EACF,EAAE;YACzB,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,OAAO,CAAC,CAAC;YAC7C,MAAM,SAAS,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;YAC1C,MAAM,QAAQ,GAAG,SAAS;gBACxB,CAAC,CAAC,OAAO,CAAC,iBAAiB;gBAC3B,CAAC,CAAC,OAAO,CAAC,iBAAiB,CAAC;YAE9B,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;YAE7D,IAAI,CAAC,WAAW,CAAC,aAAa,EAAE,CAAC;gBAC/B,OAAO,MAAM,CAAC,GAAG,EAAE;oBACjB,KAAK,EAAE,yBAAyB;oBAChC,IAAI,EAAE,iBAAiB;iBACxB,CAAC,CAAC;YACL,CAAC;YACD,IAAI,CAAC,WAAW,CAAC,aAAa,EAAE,CAAC;gBAC/B,OAAO,MAAM,CAAC,GAAG,EAAE;oBACjB,KAAK,EAAE,0BAA0B;oBACjC,IAAI,EAAE,WAAW;iBAClB,CAAC,CAAC;YACL,CAAC;YAED,MAAM,QAAQ,GAAG,SAAS;gBACxB,CAAC,CAAC,IAAI;gBACN,CAAC,CAAC,WAAW,CAAC,eAAe,IAAI,IAAI,CAAC;YAExC,IAAI,CAAC,SAAS,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAC5B,OAAO,MAAM,CAAC,GAAG,EAAE;oBACjB,KAAK,EAAE,+BAA+B;oBACtC,IAAI,EAAE,iBAAiB;iBACxB,CAAC,CAAC;YACL,CAAC;YAED,OAAO,OAAO,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,MAAM,CAAC,CAAC;QAC3D,CAAC,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mountable route-handler factory for the template-manager admin UI.
|
|
3
|
+
*
|
|
4
|
+
* v3.1.0 lifts the test-app's route handlers + auth wrapper into a single
|
|
5
|
+
* factory that consumers wire up with three lines:
|
|
6
|
+
*
|
|
7
|
+
* ```ts
|
|
8
|
+
* // app/api/template_manager/[...path]/route.ts
|
|
9
|
+
* import { create_template_manager_handlers } from 'hazo_notify/template_manager_handlers';
|
|
10
|
+
* import { create_hazo_auth_adapter } from 'hazo_notify/template_manager_handlers/hazo_auth';
|
|
11
|
+
* import { get_db } from '@/lib/db';
|
|
12
|
+
*
|
|
13
|
+
* export const dynamic = 'force-dynamic';
|
|
14
|
+
*
|
|
15
|
+
* const handlers = create_template_manager_handlers({
|
|
16
|
+
* hazo_connect_factory: () => get_db(),
|
|
17
|
+
* auth: await create_hazo_auth_adapter(),
|
|
18
|
+
* });
|
|
19
|
+
*
|
|
20
|
+
* export const { GET, POST, PUT, PATCH, DELETE, OPTIONS } = handlers;
|
|
21
|
+
* ```
|
|
22
|
+
*
|
|
23
|
+
* Routes handled (relative to mount point):
|
|
24
|
+
* GET /categories list categories
|
|
25
|
+
* POST /categories create category
|
|
26
|
+
* GET /categories/:id get category
|
|
27
|
+
* PUT /categories/:id update category (PATCH alias)
|
|
28
|
+
* DELETE /categories/:id delete category
|
|
29
|
+
* GET /templates list templates (?category_id filters)
|
|
30
|
+
* POST /templates create template
|
|
31
|
+
* GET /templates/:id get template
|
|
32
|
+
* PUT /templates/:id update template (PATCH alias)
|
|
33
|
+
* DELETE /templates/:id delete template
|
|
34
|
+
* GET /types list registered template types
|
|
35
|
+
*/
|
|
36
|
+
import 'server-only';
|
|
37
|
+
import { NextRequest, NextResponse } from 'next/server';
|
|
38
|
+
import type { HazoConnectInstance } from '../types.js';
|
|
39
|
+
import { type TemplateManagerAuthAdapter } from './auth.js';
|
|
40
|
+
export type { TemplateManagerAuth, TemplateManagerAuthAdapter, TemplateManagerAuthAdapterResult, TemplateManagerHandler, } from './auth.js';
|
|
41
|
+
export { create_with_template_auth } from './auth.js';
|
|
42
|
+
export interface TemplateManagerHandlersOptions {
|
|
43
|
+
/**
|
|
44
|
+
* Returns the hazo_connect instance to use for this request. Called per
|
|
45
|
+
* request so the consumer can short-circuit to a singleton or per-request
|
|
46
|
+
* connection as appropriate.
|
|
47
|
+
*/
|
|
48
|
+
hazo_connect_factory: () => Promise<HazoConnectInstance> | HazoConnectInstance;
|
|
49
|
+
/** Auth adapter (see `create_hazo_auth_adapter` for the hazo_auth default). */
|
|
50
|
+
auth: TemplateManagerAuthAdapter;
|
|
51
|
+
/**
|
|
52
|
+
* CORS headers to attach to every response. Defaults to building from
|
|
53
|
+
* `cors_allowed_origins` in `hazo_notify_config.ini` (wildcard if missing).
|
|
54
|
+
* Pass a function to recompute per request.
|
|
55
|
+
*/
|
|
56
|
+
cors_headers?: HeadersInit | (() => HeadersInit);
|
|
57
|
+
}
|
|
58
|
+
export interface TemplateManagerHandlers {
|
|
59
|
+
GET: (request: NextRequest, ctx?: unknown) => Promise<NextResponse>;
|
|
60
|
+
POST: (request: NextRequest, ctx?: unknown) => Promise<NextResponse>;
|
|
61
|
+
PUT: (request: NextRequest, ctx?: unknown) => Promise<NextResponse>;
|
|
62
|
+
PATCH: (request: NextRequest, ctx?: unknown) => Promise<NextResponse>;
|
|
63
|
+
DELETE: (request: NextRequest, ctx?: unknown) => Promise<NextResponse>;
|
|
64
|
+
OPTIONS: () => Promise<NextResponse>;
|
|
65
|
+
}
|
|
66
|
+
export declare function create_template_manager_handlers(options: TemplateManagerHandlersOptions): TemplateManagerHandlers;
|
|
67
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/lib/template_manager/handlers/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAEH,OAAO,aAAa,CAAC;AACrB,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAkBxD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EAGL,KAAK,0BAA0B,EAChC,MAAM,WAAW,CAAC;AAEnB,YAAY,EACV,mBAAmB,EACnB,0BAA0B,EAC1B,gCAAgC,EAChC,sBAAsB,GACvB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,yBAAyB,EAAE,MAAM,WAAW,CAAC;AAKtD,MAAM,WAAW,8BAA8B;IAC7C;;;;OAIG;IACH,oBAAoB,EAAE,MAClB,OAAO,CAAC,mBAAmB,CAAC,GAC5B,mBAAmB,CAAC;IACxB,+EAA+E;IAC/E,IAAI,EAAE,0BAA0B,CAAC;IACjC;;;;OAIG;IACH,YAAY,CAAC,EAAE,WAAW,GAAG,CAAC,MAAM,WAAW,CAAC,CAAC;CAClD;AAED,MAAM,WAAW,uBAAuB;IACtC,GAAG,EAAE,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,YAAY,CAAC,CAAC;IACpE,IAAI,EAAE,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,YAAY,CAAC,CAAC;IACrE,GAAG,EAAE,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,YAAY,CAAC,CAAC;IACpE,KAAK,EAAE,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,YAAY,CAAC,CAAC;IACtE,MAAM,EAAE,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,YAAY,CAAC,CAAC;IACvE,OAAO,EAAE,MAAM,OAAO,CAAC,YAAY,CAAC,CAAC;CACtC;AAmCD,wBAAgB,gCAAgC,CAC9C,OAAO,EAAE,8BAA8B,GACtC,uBAAuB,CAmRzB"}
|