@porulle/core 0.53.0 → 0.54.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/dist/modules/catalog/entity-service.d.ts.map +1 -1
- package/dist/modules/catalog/entity-service.js +22 -4
- package/dist/modules/customers/repository/index.d.ts +6 -0
- package/dist/modules/customers/repository/index.d.ts.map +1 -1
- package/dist/modules/customers/repository/index.js +18 -0
- package/dist/modules/customers/service.d.ts.map +1 -1
- package/dist/modules/customers/service.js +11 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/src/modules/catalog/entity-service.ts +22 -4
- package/src/modules/customers/repository/index.ts +22 -0
- package/src/modules/customers/service.ts +9 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entity-service.d.ts","sourceRoot":"","sources":["../../../src/modules/catalog/entity-service.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"entity-service.d.ts","sourceRoot":"","sources":["../../../src/modules/catalog/entity-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,7 +6,7 @@ import { createHookContext } from "../../kernel/hooks/create-context.js";
|
|
|
6
6
|
import { Err, Ok } from "../../kernel/result.js";
|
|
7
7
|
import { createLogger } from "../../utils/logger.js";
|
|
8
8
|
import { paginate } from "../../utils/pagination.js";
|
|
9
|
-
import { isWriteContextTransactional } from "../../kernel/database/tx-context.js";
|
|
9
|
+
import { createTxContext, isWriteContextTransactional } from "../../kernel/database/tx-context.js";
|
|
10
10
|
import { canReadUnpublishedCatalog, isCatalogEntityVisible } from "./read-policy.js";
|
|
11
11
|
import { isValidFieldPath } from "./ownership.js";
|
|
12
12
|
function hookDatabaseArg(database) {
|
|
@@ -514,23 +514,38 @@ export class EntityService {
|
|
|
514
514
|
}
|
|
515
515
|
const beforeAttr = await this.repo.findAttributeByLocale(entityId, locale, txCtx);
|
|
516
516
|
const changedFieldPaths = [];
|
|
517
|
+
let changed = false;
|
|
517
518
|
for (const field of attributeFields) {
|
|
518
519
|
if (attrs[field] === undefined)
|
|
519
520
|
continue;
|
|
520
521
|
const before = beforeAttr?.[field] ?? null;
|
|
521
522
|
const after = attrs[field] ?? null;
|
|
522
523
|
if (before !== after) {
|
|
524
|
+
changed = true;
|
|
523
525
|
const path = `attributes.${locale}.${field}`;
|
|
524
526
|
if (isValidFieldPath(path))
|
|
525
527
|
changedFieldPaths.push(path);
|
|
526
528
|
}
|
|
527
529
|
}
|
|
528
|
-
|
|
530
|
+
// An identical re-set writes nothing and moves nothing: an idempotent save must not look like an
|
|
531
|
+
// edit to anything that versions the product.
|
|
532
|
+
if (!changed && beforeAttr)
|
|
533
|
+
return Ok(undefined);
|
|
534
|
+
// The attribute write and the entity's `updated_at` bump commit together. Consumers version a
|
|
535
|
+
// product from `sellable_entities.updated_at`; an attribute change that left it unmoved was
|
|
536
|
+
// invisible to them — a changed title never re-indexed (sim, 2026-09-24).
|
|
537
|
+
const write = async (writeCtx) => {
|
|
538
|
+
await this.repo.upsertAttribute(entityId, locale, { title: attrs.title, subtitle: attrs.subtitle, description: attrs.description, richDescription: attrs.richDescription, seoTitle: attrs.seoTitle, seoDescription: attrs.seoDescription }, writeCtx);
|
|
539
|
+
return changed ? this.repo.updateEntity(entityId, {}, writeCtx) : undefined;
|
|
540
|
+
};
|
|
541
|
+
const updated = txCtx
|
|
542
|
+
? await write(txCtx)
|
|
543
|
+
: await this.deps.database.transaction((tx) => write(createTxContext(tx, { actor })));
|
|
529
544
|
if (changedFieldPaths.length > 0) {
|
|
530
545
|
const afterHooks = this.deps.hooks.resolve("catalog.afterUpdate");
|
|
531
546
|
const context = catalogHookContext(this.deps, actor, ctx, "update");
|
|
532
547
|
context.context.changedFieldPaths = changedFieldPaths;
|
|
533
|
-
await runAfterHooks(afterHooks, entity, entity, "update", context, (hook) => this.deps.hooks.runsInTransaction(hook));
|
|
548
|
+
await runAfterHooks(afterHooks, entity, updated ?? entity, "update", context, (hook) => this.deps.hooks.runsInTransaction(hook));
|
|
534
549
|
}
|
|
535
550
|
return Ok(undefined);
|
|
536
551
|
}
|
|
@@ -555,10 +570,13 @@ export class EntityService {
|
|
|
555
570
|
const entity = await this.repo.findEntityById(entityId, txCtx);
|
|
556
571
|
if (!entity)
|
|
557
572
|
return;
|
|
573
|
+
// The related rows changed, so the entity's `updated_at` moves with them (in the caller's
|
|
574
|
+
// transaction when it has one) — the same versioning contract as `setAttributes`.
|
|
575
|
+
const updated = await this.repo.updateEntity(entityId, {}, txCtx);
|
|
558
576
|
const afterHooks = this.deps.hooks.resolve("catalog.afterUpdate");
|
|
559
577
|
const context = catalogHookContext(this.deps, actor, ctx, "update");
|
|
560
578
|
context.context.changedFieldPaths = [...changedFieldPaths];
|
|
561
|
-
await runAfterHooks(afterHooks, entity, entity, "update", context, (hook) => this.deps.hooks.runsInTransaction(hook));
|
|
579
|
+
await runAfterHooks(afterHooks, entity, updated ?? entity, "update", context, (hook) => this.deps.hooks.runsInTransaction(hook));
|
|
562
580
|
}
|
|
563
581
|
async getAttributes(entityId, locale, actor, ctx) {
|
|
564
582
|
try {
|
|
@@ -22,6 +22,12 @@ export declare class CustomersRepository {
|
|
|
22
22
|
constructor(db: DrizzleDatabase);
|
|
23
23
|
private getDb;
|
|
24
24
|
findById(orgId: string, id: string, ctx?: TxContext): Promise<Customer | undefined>;
|
|
25
|
+
/**
|
|
26
|
+
* The auth user's email, when no OTHER customer profile in this organization already holds it
|
|
27
|
+
* (`customers` is unique on organization + email). Undefined otherwise — the caller then leaves the
|
|
28
|
+
* profile's email as it is rather than fail the whole profile read on the unique index.
|
|
29
|
+
*/
|
|
30
|
+
claimableUserEmail(orgId: string, userId: string, ctx?: TxContext): Promise<string | undefined>;
|
|
25
31
|
findByUserId(orgId: string, userId: string, ctx?: TxContext): Promise<Customer | undefined>;
|
|
26
32
|
findByEmail(orgId: string, email: string, ctx?: TxContext): Promise<Customer | undefined>;
|
|
27
33
|
findByPosPin(orgId: string, hashedPin: string, ctx?: TxContext): Promise<Customer | undefined>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/modules/customers/repository/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wCAAwC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/modules/customers/repository/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { eq, and, desc } from "drizzle-orm";
|
|
2
|
+
import { user } from "../../../auth/auth-schema.js";
|
|
2
3
|
import { customers, customerAddresses, customerGroups, customerGroupMembers, customerInteractions, } from "../schema.js";
|
|
3
4
|
/**
|
|
4
5
|
* CustomersRepository provides type-safe database operations for customers.
|
|
@@ -25,6 +26,23 @@ export class CustomersRepository {
|
|
|
25
26
|
.where(and(eq(customers.organizationId, orgId), eq(customers.id, id)));
|
|
26
27
|
return rows[0];
|
|
27
28
|
}
|
|
29
|
+
/**
|
|
30
|
+
* The auth user's email, when no OTHER customer profile in this organization already holds it
|
|
31
|
+
* (`customers` is unique on organization + email). Undefined otherwise — the caller then leaves the
|
|
32
|
+
* profile's email as it is rather than fail the whole profile read on the unique index.
|
|
33
|
+
*/
|
|
34
|
+
async claimableUserEmail(orgId, userId, ctx) {
|
|
35
|
+
const db = this.getDb(ctx);
|
|
36
|
+
const [account] = await db.select({ email: user.email }).from(user).where(eq(user.id, userId));
|
|
37
|
+
if (!account?.email)
|
|
38
|
+
return undefined;
|
|
39
|
+
const [holder] = await db
|
|
40
|
+
.select({ userId: customers.userId })
|
|
41
|
+
.from(customers)
|
|
42
|
+
.where(and(eq(customers.organizationId, orgId), eq(customers.email, account.email)))
|
|
43
|
+
.limit(1);
|
|
44
|
+
return holder === undefined || holder.userId === userId ? account.email : undefined;
|
|
45
|
+
}
|
|
28
46
|
async findByUserId(orgId, userId, ctx) {
|
|
29
47
|
const db = this.getDb(ctx);
|
|
30
48
|
const rows = await db
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../src/modules/customers/service.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../src/modules/customers/service.ts"],"names":[],"mappings":"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"}
|
|
@@ -127,14 +127,24 @@ export class CustomerService {
|
|
|
127
127
|
return Ok(undefined);
|
|
128
128
|
}
|
|
129
129
|
async getOrCreateByUserId(orgId, userId, actor, ctx) {
|
|
130
|
+
// The profile carries the shopper's email: it is the key channel redaction uses, so a profile
|
|
131
|
+
// without one cannot be erased once its orders have been exported. Filled on creation, and on
|
|
132
|
+
// the next access of a profile created before this (never overwriting an email it has).
|
|
130
133
|
const existing = await this.repo.findByUserId(orgId, userId, ctx);
|
|
131
134
|
if (existing) {
|
|
132
|
-
|
|
135
|
+
if (existing.email)
|
|
136
|
+
return existing;
|
|
137
|
+
const email = await this.repo.claimableUserEmail(orgId, userId, ctx);
|
|
138
|
+
if (!email)
|
|
139
|
+
return existing;
|
|
140
|
+
return (await this.repo.update(existing.id, { email }, ctx)) ?? existing;
|
|
133
141
|
}
|
|
142
|
+
const email = await this.repo.claimableUserEmail(orgId, userId, ctx);
|
|
134
143
|
const customer = await this.repo.create({
|
|
135
144
|
organizationId: orgId,
|
|
136
145
|
userId,
|
|
137
146
|
metadata: {},
|
|
147
|
+
...(email !== undefined ? { email } : {}),
|
|
138
148
|
}, ctx);
|
|
139
149
|
const afterHooks = this.deps.hooks.resolve("customers.afterCreate");
|
|
140
150
|
const hctx = hookContext(actor, this.deps.services, this.deps.database, this.deps.config, ctx?.tx ?? null);
|