mirror of
https://git.meshkee.com/Meshkee/backend.git
synced 2026-08-11 22:30:59 +04:30
Allow register to link existing Meshkee accounts after acknowledgement.
Adds optional acknowledgeExistingAccount and documents the CELL_EXISTS_OTHER_SITE → SMS link flow for storefronts. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
co-authored by
Cursor
parent
f7cee26975
commit
0f92307fcd
@@ -23,7 +23,7 @@ You are building a **Meshkee business website (storefront)**. You must use the M
|
||||
1. Resolve tenant first: `GET /tenants/<WEBSITE_DOMAIN>` → save `businessId` from `id`.
|
||||
2. All public content uses `/tenants/<WEBSITE_DOMAIN>/...` (no auth).
|
||||
3. Cart, orders, favorites use `/businesses/<businessId>/...` with `Authorization: Bearer <accessToken>`.
|
||||
4. Customer register body must include `"domain": "<WEBSITE_DOMAIN>"`.
|
||||
4. Customer register body must include `"domain": "<WEBSITE_DOMAIN>"`. If the cell already exists on another Meshkee site and the password differs, API returns `409` with `CELL_EXISTS_OTHER_SITE:...`. Retry register with `"acknowledgeExistingAccount": true` to link that account (password/profile stay unchanged), then complete SMS OTP.
|
||||
5. Cell numbers are E.164 (`+98912...`).
|
||||
6. Do not call dashboard/CMS routes (`/businesses/.../products` write APIs, media upload, domain-admin, etc.).
|
||||
7. **Partner SMS** (`POST /public/sms/send`) is for external partner backends with an issued `X-Api-Key` only — not for normal storefront UI. See https://api.meshkee.com/docs/website/SMS.md
|
||||
|
||||
@@ -171,7 +171,7 @@
|
||||
],
|
||||
"body": {
|
||||
"mode": "raw",
|
||||
"raw": "{\n \"cellNumber\": \"+98XXXXXXXXXX\",\n \"password\": \"min8chars\",\n \"firstName\": \"First\",\n \"lastName\": \"Last\",\n \"email\": \"optional@example.com\",\n \"domain\": \"{{domain}}\"\n}"
|
||||
"raw": "{\n \"cellNumber\": \"+98XXXXXXXXXX\",\n \"password\": \"min8chars\",\n \"firstName\": \"First\",\n \"lastName\": \"Last\",\n \"email\": \"optional@example.com\",\n \"domain\": \"{{domain}}\",\n \"acknowledgeExistingAccount\": false\n}"
|
||||
},
|
||||
"url": "{{baseUrl}}/auth/register"
|
||||
}
|
||||
|
||||
@@ -557,7 +557,11 @@
|
||||
"firstName": { "type": "string" },
|
||||
"lastName": { "type": "string" },
|
||||
"email": { "type": "string" },
|
||||
"domain": { "type": "string", "description": "Same website apex as {domain}" }
|
||||
"domain": { "type": "string", "description": "Same website apex as {domain}" },
|
||||
"acknowledgeExistingAccount": {
|
||||
"type": "boolean",
|
||||
"description": "If true, link an existing Meshkee account from another website without matching its password. Existing password and profile stay unchanged."
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -79,7 +79,7 @@ export class AuthService {
|
||||
existingUser.passwordHash,
|
||||
);
|
||||
|
||||
if (!passwordValid) {
|
||||
if (!passwordValid && !dto.acknowledgeExistingAccount) {
|
||||
const otherNames = existingUser.businessCustomers
|
||||
.map((item) => item.business.nameFa?.trim() || item.business.name)
|
||||
.filter(Boolean);
|
||||
|
||||
@@ -1,4 +1,11 @@
|
||||
import { IsEmail, IsOptional, IsString, Matches, MinLength } from 'class-validator';
|
||||
import {
|
||||
IsBoolean,
|
||||
IsEmail,
|
||||
IsOptional,
|
||||
IsString,
|
||||
Matches,
|
||||
MinLength,
|
||||
} from 'class-validator';
|
||||
|
||||
export class RegisterDto {
|
||||
@IsString()
|
||||
@@ -27,4 +34,12 @@ export class RegisterDto {
|
||||
@IsString()
|
||||
@MinLength(3)
|
||||
domain!: string;
|
||||
|
||||
/**
|
||||
* When true, link an existing Meshkee account (other websites) to this tenant
|
||||
* without requiring the existing password. Existing password and profile stay unchanged.
|
||||
*/
|
||||
@IsOptional()
|
||||
@IsBoolean()
|
||||
acknowledgeExistingAccount?: boolean;
|
||||
}
|
||||
|
||||
@@ -23,7 +23,7 @@ You are building a **Meshkee business website (storefront)**. You must use the M
|
||||
1. Resolve tenant first: `GET /tenants/<WEBSITE_DOMAIN>` → save `businessId` from `id`.
|
||||
2. All public content uses `/tenants/<WEBSITE_DOMAIN>/...` (no auth).
|
||||
3. Cart, orders, favorites use `/businesses/<businessId>/...` with `Authorization: Bearer <accessToken>`.
|
||||
4. Customer register body must include `"domain": "<WEBSITE_DOMAIN>"`.
|
||||
4. Customer register body must include `"domain": "<WEBSITE_DOMAIN>"`. If the cell already exists on another Meshkee site and the password differs, API returns `409` with `CELL_EXISTS_OTHER_SITE:...`. Retry register with `"acknowledgeExistingAccount": true` to link that account (password/profile stay unchanged), then complete SMS OTP.
|
||||
5. Cell numbers are E.164 (`+98912...`).
|
||||
6. Do not call dashboard/CMS routes (`/businesses/.../products` write APIs, media upload, domain-admin, etc.).
|
||||
7. **Partner SMS** (`POST /public/sms/send`) is for external partner backends with an issued `X-Api-Key` only — not for normal storefront UI. See https://api.meshkee.com/docs/website/SMS.md
|
||||
|
||||
@@ -171,7 +171,7 @@
|
||||
],
|
||||
"body": {
|
||||
"mode": "raw",
|
||||
"raw": "{\n \"cellNumber\": \"+98XXXXXXXXXX\",\n \"password\": \"min8chars\",\n \"firstName\": \"First\",\n \"lastName\": \"Last\",\n \"email\": \"optional@example.com\",\n \"domain\": \"{{domain}}\"\n}"
|
||||
"raw": "{\n \"cellNumber\": \"+98XXXXXXXXXX\",\n \"password\": \"min8chars\",\n \"firstName\": \"First\",\n \"lastName\": \"Last\",\n \"email\": \"optional@example.com\",\n \"domain\": \"{{domain}}\",\n \"acknowledgeExistingAccount\": false\n}"
|
||||
},
|
||||
"url": "{{baseUrl}}/auth/register"
|
||||
}
|
||||
|
||||
@@ -557,7 +557,11 @@
|
||||
"firstName": { "type": "string" },
|
||||
"lastName": { "type": "string" },
|
||||
"email": { "type": "string" },
|
||||
"domain": { "type": "string", "description": "Same website apex as {domain}" }
|
||||
"domain": { "type": "string", "description": "Same website apex as {domain}" },
|
||||
"acknowledgeExistingAccount": {
|
||||
"type": "boolean",
|
||||
"description": "If true, link an existing Meshkee account from another website without matching its password. Existing password and profile stay unchanged."
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user