@feelflow/ffid-sdk 7.0.0 → 7.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 +47 -0
- package/dist/{chunk-BI6UM2EJ.cjs → chunk-CI4N7KJK.cjs} +350 -61
- package/dist/{chunk-32VOLLNV.js → chunk-Y4TUICQZ.js} +345 -62
- package/dist/components/index.cjs +8 -8
- package/dist/components/index.js +1 -1
- package/dist/{ffid-client-C8XV7lUt.d.cts → ffid-client-BFgoVPOZ.d.cts} +161 -1
- package/dist/{ffid-client-CpVixUM3.d.ts → ffid-client-QNEFA3mv.d.ts} +161 -1
- package/dist/index.cjs +82 -58
- package/dist/index.d.cts +161 -1
- package/dist/index.d.ts +161 -1
- package/dist/index.js +2 -2
- package/dist/server/index.cjs +350 -61
- package/dist/server/index.d.cts +2 -2
- package/dist/server/index.d.ts +2 -2
- package/dist/server/index.js +345 -62
- package/dist/server/test/index.d.cts +1 -1
- package/dist/server/test/index.d.ts +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -397,6 +397,53 @@ await ffid.updateMemberRole({
|
|
|
397
397
|
- `role` は `admin` / `member` / `viewer` のみ指定可能です。`owner` は追加・昇格 API では扱いません。
|
|
398
398
|
- agency client と同じ呼び味が必要な場合は `ffid.addMember(organizationId, { email, role })` も使えます。
|
|
399
399
|
|
|
400
|
+
### Organization profile / public logo wall
|
|
401
|
+
|
|
402
|
+
hub 等の外部サービスが企業プロフィールを登録・照会し、FeelFlow 全サービス共通のロゴウォールを表示するためのメソッド(#5485 / #5547)。
|
|
403
|
+
|
|
404
|
+
- **`getOrganizationProfile` / `upsertOrganizationProfile` / `uploadOrganizationLogo`** は **`authMode: 'service-key'` 専用**(scope: `organization:read` / `organization:write`)。`token` / `cookie` モードで呼ぶとサーバーへ往復せず `VALIDATION_ERROR`。
|
|
405
|
+
- **`getPublicLogoWall`** は認証不要。service-key を送らない。エンドポイントは `GET /api/v1/organizations/logo-wall`(公開 API なので SDK を使わず直接 GET してもよいが、型付きエラーが欲しければ SDK 経由を推奨)。
|
|
406
|
+
- `upsert` の `listingConsent.consented: true` では `consentVersion` と `consentedByUserId` が必須。同意操作者が対象 org の active メンバーでないとサーバーが `CONSENTED_BY_NOT_MEMBER` を返す。
|
|
407
|
+
|
|
408
|
+
```ts
|
|
409
|
+
import {
|
|
410
|
+
createFFIDClient,
|
|
411
|
+
FFID_ORGANIZATION_PROFILE_ERROR_CODES,
|
|
412
|
+
} from '@feelflow/ffid-sdk/server'
|
|
413
|
+
|
|
414
|
+
const ffid = createFFIDClient({
|
|
415
|
+
serviceCode: 'feel-agent',
|
|
416
|
+
scope: '',
|
|
417
|
+
authMode: 'service-key',
|
|
418
|
+
serviceApiKey: process.env.FFID_SERVICE_API_KEY!,
|
|
419
|
+
})
|
|
420
|
+
|
|
421
|
+
const current = await ffid.getOrganizationProfile(organizationId)
|
|
422
|
+
if (current.error) throw new Error(current.error.message)
|
|
423
|
+
|
|
424
|
+
const upsert = await ffid.upsertOrganizationProfile(organizationId, {
|
|
425
|
+
displayName: '株式会社サンプル',
|
|
426
|
+
industry: 'it-software',
|
|
427
|
+
companySize: '11-50',
|
|
428
|
+
websiteUrl: 'https://example.co.jp',
|
|
429
|
+
listingConsent: {
|
|
430
|
+
consented: true,
|
|
431
|
+
consentVersion: 'v1.0',
|
|
432
|
+
consentedByUserId: userId,
|
|
433
|
+
},
|
|
434
|
+
})
|
|
435
|
+
if (upsert.error?.code === FFID_ORGANIZATION_PROFILE_ERROR_CODES.CONSENTED_BY_NOT_MEMBER) {
|
|
436
|
+
throw new Error(upsert.error.message)
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
await ffid.uploadOrganizationLogo(organizationId, logoFile)
|
|
440
|
+
|
|
441
|
+
const wall = await ffid.getPublicLogoWall()
|
|
442
|
+
// wall.data.entries: { displayName, logoUrl, websiteUrl }[]
|
|
443
|
+
```
|
|
444
|
+
|
|
445
|
+
位置引数と params オブジェクトの両方を受け付ける(`addMember` と同じ)。
|
|
446
|
+
|
|
400
447
|
### Provisioning(users / organizations)
|
|
401
448
|
|
|
402
449
|
外部サービスからの一括移行向けに、**service-key 認証**でユーザー・組織を冪等にプロビジョニングするメソッド。REST を直叩きせず `createFFIDClient` 経由で呼べる(SDK-first、#3790 / #4127)。
|
|
@@ -1303,6 +1303,310 @@ function createMembersMethods(deps) {
|
|
|
1303
1303
|
return { listMembers, addMember, updateMemberRole, removeMember };
|
|
1304
1304
|
}
|
|
1305
1305
|
|
|
1306
|
+
// src/types/organization-profile.ts
|
|
1307
|
+
var FFID_INDUSTRY_CODES = [
|
|
1308
|
+
"agriculture",
|
|
1309
|
+
"construction",
|
|
1310
|
+
"manufacturing",
|
|
1311
|
+
"it-software",
|
|
1312
|
+
"telecom",
|
|
1313
|
+
"media",
|
|
1314
|
+
"retail",
|
|
1315
|
+
"wholesale",
|
|
1316
|
+
"finance-insurance",
|
|
1317
|
+
"real-estate",
|
|
1318
|
+
"transport-logistics",
|
|
1319
|
+
"hospitality-food",
|
|
1320
|
+
"healthcare",
|
|
1321
|
+
"education",
|
|
1322
|
+
"professional-services",
|
|
1323
|
+
"marketing-advertising",
|
|
1324
|
+
"energy-utilities",
|
|
1325
|
+
"public-sector",
|
|
1326
|
+
"nonprofit",
|
|
1327
|
+
"other"
|
|
1328
|
+
];
|
|
1329
|
+
var FFID_COMPANY_SIZE_CODES = [
|
|
1330
|
+
"1-10",
|
|
1331
|
+
"11-50",
|
|
1332
|
+
"51-200",
|
|
1333
|
+
"201-500",
|
|
1334
|
+
"501-1000",
|
|
1335
|
+
"1001+"
|
|
1336
|
+
];
|
|
1337
|
+
var BYTES_PER_KB = 1024;
|
|
1338
|
+
var KB_PER_MB = 1024;
|
|
1339
|
+
var FFID_MAX_ORGANIZATION_LOGO_FILE_SIZE_MB = 2;
|
|
1340
|
+
var FFID_MAX_ORGANIZATION_LOGO_FILE_SIZE_BYTES = FFID_MAX_ORGANIZATION_LOGO_FILE_SIZE_MB * KB_PER_MB * BYTES_PER_KB;
|
|
1341
|
+
var FFID_ALLOWED_ORGANIZATION_LOGO_MIME_TYPES = [
|
|
1342
|
+
"image/png",
|
|
1343
|
+
"image/jpeg",
|
|
1344
|
+
"image/webp"
|
|
1345
|
+
];
|
|
1346
|
+
var FFID_ORGANIZATION_PROFILE_ERROR_CODES = {
|
|
1347
|
+
VALIDATION_ERROR: "VALIDATION_ERROR",
|
|
1348
|
+
ORGANIZATION_NOT_FOUND: "ORGANIZATION_NOT_FOUND",
|
|
1349
|
+
CONSENTED_BY_NOT_MEMBER: "CONSENTED_BY_NOT_MEMBER",
|
|
1350
|
+
MISSING_FILE: "MISSING_FILE",
|
|
1351
|
+
INVALID_FILE_TYPE: "INVALID_FILE_TYPE",
|
|
1352
|
+
FILE_TOO_LARGE: "FILE_TOO_LARGE",
|
|
1353
|
+
INVALID_IMAGE: "INVALID_IMAGE",
|
|
1354
|
+
LOGO_UPLOAD_FAILED: "LOGO_UPLOAD_FAILED"
|
|
1355
|
+
};
|
|
1356
|
+
|
|
1357
|
+
// src/client/version-check.ts
|
|
1358
|
+
var SDK_VERSION = "7.1.0";
|
|
1359
|
+
var SDK_USER_AGENT = `FFID-SDK/${SDK_VERSION} (TypeScript)`;
|
|
1360
|
+
var SDK_VERSION_HEADER = "X-FFID-SDK-Version";
|
|
1361
|
+
function sdkHeaders() {
|
|
1362
|
+
if (typeof window !== "undefined") return {};
|
|
1363
|
+
return {
|
|
1364
|
+
"User-Agent": SDK_USER_AGENT,
|
|
1365
|
+
[SDK_VERSION_HEADER]: SDK_VERSION
|
|
1366
|
+
};
|
|
1367
|
+
}
|
|
1368
|
+
var LATEST_VERSION_HEADER = "X-FFID-SDK-Latest-Version";
|
|
1369
|
+
var SEMVER_PATTERN = /^\d+(\.\d+)*$/;
|
|
1370
|
+
var _versionWarningShown = false;
|
|
1371
|
+
function compareSemver(a, b) {
|
|
1372
|
+
const cleanA = a.replace(/^v/, "");
|
|
1373
|
+
const cleanB = b.replace(/^v/, "");
|
|
1374
|
+
if (!SEMVER_PATTERN.test(cleanA) || !SEMVER_PATTERN.test(cleanB)) return 0;
|
|
1375
|
+
const partsA = cleanA.split(".").map(Number);
|
|
1376
|
+
const partsB = cleanB.split(".").map(Number);
|
|
1377
|
+
const maxLen = Math.max(partsA.length, partsB.length);
|
|
1378
|
+
for (let i = 0; i < maxLen; i++) {
|
|
1379
|
+
const numA = partsA[i] ?? 0;
|
|
1380
|
+
const numB = partsB[i] ?? 0;
|
|
1381
|
+
if (numA < numB) return -1;
|
|
1382
|
+
if (numA > numB) return 1;
|
|
1383
|
+
}
|
|
1384
|
+
return 0;
|
|
1385
|
+
}
|
|
1386
|
+
function checkVersionHeader(response, logger) {
|
|
1387
|
+
if (_versionWarningShown) return;
|
|
1388
|
+
if (typeof process !== "undefined" && process.env?.NODE_ENV === "production") return;
|
|
1389
|
+
if (!response.headers?.get) return;
|
|
1390
|
+
const latestVersion = response.headers.get(LATEST_VERSION_HEADER);
|
|
1391
|
+
if (!latestVersion) return;
|
|
1392
|
+
if (compareSemver(SDK_VERSION, latestVersion) < 0) {
|
|
1393
|
+
_versionWarningShown = true;
|
|
1394
|
+
logger.warn(
|
|
1395
|
+
`\u65B0\u3057\u3044\u30D0\u30FC\u30B8\u30E7\u30F3\u304C\u5229\u7528\u53EF\u80FD\u3067\u3059: v${latestVersion} (\u73FE\u5728: v${SDK_VERSION})
|
|
1396
|
+
npm install @feelflow/ffid-sdk@latest \u3067\u30A2\u30C3\u30D7\u30C7\u30FC\u30C8\u3067\u304D\u307E\u3059`
|
|
1397
|
+
);
|
|
1398
|
+
}
|
|
1399
|
+
}
|
|
1400
|
+
|
|
1401
|
+
// src/client/organization-profile-methods.ts
|
|
1402
|
+
var EXT_PROFILE_ENDPOINT = "/api/v1/organizations/ext/profile";
|
|
1403
|
+
var EXT_PROFILE_LOGO_ENDPOINT = "/api/v1/organizations/ext/profile/logo";
|
|
1404
|
+
var LOGO_WALL_ENDPOINT = "/api/v1/organizations/logo-wall";
|
|
1405
|
+
var DEFAULT_LOGO_UPLOAD_FILENAME = "logo";
|
|
1406
|
+
function isBlank(value) {
|
|
1407
|
+
return !value || !value.trim();
|
|
1408
|
+
}
|
|
1409
|
+
function resolveOrganizationId(organizationIdOrParams) {
|
|
1410
|
+
return typeof organizationIdOrParams === "string" ? organizationIdOrParams : organizationIdOrParams.organizationId;
|
|
1411
|
+
}
|
|
1412
|
+
function resolveUpsertParams(organizationIdOrParams, payload) {
|
|
1413
|
+
if (typeof organizationIdOrParams === "string") {
|
|
1414
|
+
return { ...payload, organizationId: organizationIdOrParams };
|
|
1415
|
+
}
|
|
1416
|
+
return organizationIdOrParams;
|
|
1417
|
+
}
|
|
1418
|
+
function resolveUploadParams(organizationIdOrParams, file) {
|
|
1419
|
+
if (typeof organizationIdOrParams === "string") {
|
|
1420
|
+
return { organizationId: organizationIdOrParams, file };
|
|
1421
|
+
}
|
|
1422
|
+
return organizationIdOrParams;
|
|
1423
|
+
}
|
|
1424
|
+
function buildUpsertBody(params) {
|
|
1425
|
+
const { organizationId, ...body } = params;
|
|
1426
|
+
return body;
|
|
1427
|
+
}
|
|
1428
|
+
function profileQuery(organizationId) {
|
|
1429
|
+
return new URLSearchParams({ organizationId }).toString();
|
|
1430
|
+
}
|
|
1431
|
+
function logoUploadFilename(file) {
|
|
1432
|
+
if (typeof File !== "undefined" && file instanceof File && file.name) {
|
|
1433
|
+
return file.name;
|
|
1434
|
+
}
|
|
1435
|
+
return DEFAULT_LOGO_UPLOAD_FILENAME;
|
|
1436
|
+
}
|
|
1437
|
+
function listingConsentValidationError(listingConsent, createError) {
|
|
1438
|
+
if (!listingConsent || listingConsent.consented !== true) return null;
|
|
1439
|
+
if (isBlank(listingConsent.consentVersion) || isBlank(listingConsent.consentedByUserId)) {
|
|
1440
|
+
return createError(
|
|
1441
|
+
FFID_ORGANIZATION_PROFILE_ERROR_CODES.VALIDATION_ERROR,
|
|
1442
|
+
"\u63B2\u8F09\u540C\u610F\u3092\u8A18\u9332\u3059\u308B\u5834\u5408\u306F consentVersion \u3068 consentedByUserId \u304C\u5FC5\u9808\u3067\u3059"
|
|
1443
|
+
);
|
|
1444
|
+
}
|
|
1445
|
+
return null;
|
|
1446
|
+
}
|
|
1447
|
+
function resolveLogoFile(file, createError) {
|
|
1448
|
+
if (!file) {
|
|
1449
|
+
return {
|
|
1450
|
+
ok: false,
|
|
1451
|
+
error: createError(
|
|
1452
|
+
FFID_ORGANIZATION_PROFILE_ERROR_CODES.MISSING_FILE,
|
|
1453
|
+
"file \u30D5\u30A3\u30FC\u30EB\u30C9\u306B\u30ED\u30B4\u753B\u50CF\u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044"
|
|
1454
|
+
)
|
|
1455
|
+
};
|
|
1456
|
+
}
|
|
1457
|
+
if (file.size > FFID_MAX_ORGANIZATION_LOGO_FILE_SIZE_BYTES) {
|
|
1458
|
+
return {
|
|
1459
|
+
ok: false,
|
|
1460
|
+
error: createError(
|
|
1461
|
+
FFID_ORGANIZATION_PROFILE_ERROR_CODES.FILE_TOO_LARGE,
|
|
1462
|
+
`\u30ED\u30B4\u753B\u50CF\u306F${FFID_MAX_ORGANIZATION_LOGO_FILE_SIZE_MB}MB\u4EE5\u4E0B\u306B\u3057\u3066\u304F\u3060\u3055\u3044`
|
|
1463
|
+
)
|
|
1464
|
+
};
|
|
1465
|
+
}
|
|
1466
|
+
if (file.type !== "" && !FFID_ALLOWED_ORGANIZATION_LOGO_MIME_TYPES.includes(file.type)) {
|
|
1467
|
+
return {
|
|
1468
|
+
ok: false,
|
|
1469
|
+
error: createError(
|
|
1470
|
+
FFID_ORGANIZATION_PROFILE_ERROR_CODES.INVALID_FILE_TYPE,
|
|
1471
|
+
"\u30ED\u30B4\u753B\u50CF\u306F PNG / JPEG / WebP \u5F62\u5F0F\u3067\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044"
|
|
1472
|
+
)
|
|
1473
|
+
};
|
|
1474
|
+
}
|
|
1475
|
+
return { ok: true, file };
|
|
1476
|
+
}
|
|
1477
|
+
function createOrganizationProfileMethods(deps) {
|
|
1478
|
+
const { fetchWithAuth, createError, authMode, baseUrl, logger, errorCodes } = deps;
|
|
1479
|
+
function serviceKeyModeError() {
|
|
1480
|
+
if (authMode === "service-key") return null;
|
|
1481
|
+
return createError(
|
|
1482
|
+
FFID_ORGANIZATION_PROFILE_ERROR_CODES.VALIDATION_ERROR,
|
|
1483
|
+
"getOrganizationProfile / upsertOrganizationProfile / uploadOrganizationLogo \u306F service-key \u8A8D\u8A3C\uFF08X-Service-Api-Key\uFF09\u3067\u306E\u307F\u5229\u7528\u3067\u304D\u307E\u3059\u3002Bearer / cookie \u30E2\u30FC\u30C9\u3067\u306F\u547C\u3073\u51FA\u305B\u307E\u305B\u3093"
|
|
1484
|
+
);
|
|
1485
|
+
}
|
|
1486
|
+
function requireOrganizationId(organizationId) {
|
|
1487
|
+
if (isBlank(organizationId)) {
|
|
1488
|
+
return createError(
|
|
1489
|
+
FFID_ORGANIZATION_PROFILE_ERROR_CODES.VALIDATION_ERROR,
|
|
1490
|
+
"organizationId \u306F\u5FC5\u9808\u3067\u3059"
|
|
1491
|
+
);
|
|
1492
|
+
}
|
|
1493
|
+
return null;
|
|
1494
|
+
}
|
|
1495
|
+
async function fetchPublic(endpoint, options = {}) {
|
|
1496
|
+
const url = `${baseUrl}${endpoint}`;
|
|
1497
|
+
logger.debug("Fetching (public):", url);
|
|
1498
|
+
let response;
|
|
1499
|
+
try {
|
|
1500
|
+
response = await fetch(url, {
|
|
1501
|
+
...options,
|
|
1502
|
+
credentials: "omit",
|
|
1503
|
+
headers: {
|
|
1504
|
+
...sdkHeaders(),
|
|
1505
|
+
...options.headers
|
|
1506
|
+
}
|
|
1507
|
+
});
|
|
1508
|
+
} catch (error) {
|
|
1509
|
+
logger.error("Network error:", error);
|
|
1510
|
+
return {
|
|
1511
|
+
error: {
|
|
1512
|
+
code: errorCodes.NETWORK_ERROR,
|
|
1513
|
+
message: error instanceof Error ? error.message : "\u30CD\u30C3\u30C8\u30EF\u30FC\u30AF\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F"
|
|
1514
|
+
}
|
|
1515
|
+
};
|
|
1516
|
+
}
|
|
1517
|
+
let parsed;
|
|
1518
|
+
try {
|
|
1519
|
+
parsed = await response.json();
|
|
1520
|
+
} catch (parseError) {
|
|
1521
|
+
logger.error("Parse error:", parseError, "Status:", response.status);
|
|
1522
|
+
return {
|
|
1523
|
+
error: {
|
|
1524
|
+
code: errorCodes.PARSE_ERROR,
|
|
1525
|
+
message: `\u30B5\u30FC\u30D0\u30FC\u304B\u3089\u4E0D\u6B63\u306A\u30EC\u30B9\u30DD\u30F3\u30B9\u3092\u53D7\u4FE1\u3057\u307E\u3057\u305F (status: ${response.status})`
|
|
1526
|
+
}
|
|
1527
|
+
};
|
|
1528
|
+
}
|
|
1529
|
+
if (!parsed || typeof parsed !== "object") {
|
|
1530
|
+
return {
|
|
1531
|
+
error: {
|
|
1532
|
+
code: errorCodes.PARSE_ERROR,
|
|
1533
|
+
message: `\u30B5\u30FC\u30D0\u30FC\u304B\u3089\u4E0D\u6B63\u306A\u30EC\u30B9\u30DD\u30F3\u30B9\u3092\u53D7\u4FE1\u3057\u307E\u3057\u305F (status: ${response.status})`
|
|
1534
|
+
}
|
|
1535
|
+
};
|
|
1536
|
+
}
|
|
1537
|
+
const raw = parsed;
|
|
1538
|
+
logger.debug("Response (public):", response.status, raw);
|
|
1539
|
+
checkVersionHeader(response, logger);
|
|
1540
|
+
if (!response.ok) {
|
|
1541
|
+
return {
|
|
1542
|
+
error: raw.error ?? {
|
|
1543
|
+
code: errorCodes.UNKNOWN_ERROR,
|
|
1544
|
+
message: "\u4E0D\u660E\u306A\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F"
|
|
1545
|
+
}
|
|
1546
|
+
};
|
|
1547
|
+
}
|
|
1548
|
+
if (raw.data === void 0) {
|
|
1549
|
+
return {
|
|
1550
|
+
error: {
|
|
1551
|
+
code: errorCodes.UNKNOWN_ERROR,
|
|
1552
|
+
message: "\u30B5\u30FC\u30D0\u30FC\u304B\u3089\u30C7\u30FC\u30BF\u304C\u8FD4\u3055\u308C\u307E\u305B\u3093\u3067\u3057\u305F"
|
|
1553
|
+
}
|
|
1554
|
+
};
|
|
1555
|
+
}
|
|
1556
|
+
return { data: raw.data };
|
|
1557
|
+
}
|
|
1558
|
+
async function getOrganizationProfile(organizationIdOrParams) {
|
|
1559
|
+
const modeError = serviceKeyModeError();
|
|
1560
|
+
if (modeError) return { error: modeError };
|
|
1561
|
+
const organizationId = resolveOrganizationId(organizationIdOrParams);
|
|
1562
|
+
const idError = requireOrganizationId(organizationId);
|
|
1563
|
+
if (idError) return { error: idError };
|
|
1564
|
+
return fetchWithAuth(
|
|
1565
|
+
`${EXT_PROFILE_ENDPOINT}?${profileQuery(organizationId)}`
|
|
1566
|
+
);
|
|
1567
|
+
}
|
|
1568
|
+
async function upsertOrganizationProfile(organizationIdOrParams, payload) {
|
|
1569
|
+
const modeError = serviceKeyModeError();
|
|
1570
|
+
if (modeError) return { error: modeError };
|
|
1571
|
+
const params = resolveUpsertParams(organizationIdOrParams, payload);
|
|
1572
|
+
const idError = requireOrganizationId(params.organizationId);
|
|
1573
|
+
if (idError) return { error: idError };
|
|
1574
|
+
const consentError = listingConsentValidationError(params.listingConsent, createError);
|
|
1575
|
+
if (consentError) return { error: consentError };
|
|
1576
|
+
return fetchWithAuth(
|
|
1577
|
+
`${EXT_PROFILE_ENDPOINT}?${profileQuery(params.organizationId)}`,
|
|
1578
|
+
{
|
|
1579
|
+
method: "PUT",
|
|
1580
|
+
body: JSON.stringify(buildUpsertBody(params))
|
|
1581
|
+
}
|
|
1582
|
+
);
|
|
1583
|
+
}
|
|
1584
|
+
async function uploadOrganizationLogo(organizationIdOrParams, file) {
|
|
1585
|
+
const modeError = serviceKeyModeError();
|
|
1586
|
+
if (modeError) return { error: modeError };
|
|
1587
|
+
const params = resolveUploadParams(organizationIdOrParams, file);
|
|
1588
|
+
const idError = requireOrganizationId(params.organizationId);
|
|
1589
|
+
if (idError) return { error: idError };
|
|
1590
|
+
const logoFile = resolveLogoFile(params.file, createError);
|
|
1591
|
+
if (!logoFile.ok) return { error: logoFile.error };
|
|
1592
|
+
const form = new FormData();
|
|
1593
|
+
form.append("file", logoFile.file, logoUploadFilename(logoFile.file));
|
|
1594
|
+
return fetchWithAuth(
|
|
1595
|
+
`${EXT_PROFILE_LOGO_ENDPOINT}?${profileQuery(params.organizationId)}`,
|
|
1596
|
+
{ method: "POST", body: form }
|
|
1597
|
+
);
|
|
1598
|
+
}
|
|
1599
|
+
async function getPublicLogoWall() {
|
|
1600
|
+
return fetchPublic(LOGO_WALL_ENDPOINT);
|
|
1601
|
+
}
|
|
1602
|
+
return {
|
|
1603
|
+
getOrganizationProfile,
|
|
1604
|
+
upsertOrganizationProfile,
|
|
1605
|
+
uploadOrganizationLogo,
|
|
1606
|
+
getPublicLogoWall
|
|
1607
|
+
};
|
|
1608
|
+
}
|
|
1609
|
+
|
|
1306
1610
|
// src/client/provisioning-methods.ts
|
|
1307
1611
|
var USER_PROVISION_ENDPOINT = "/api/v1/ext/users/provision";
|
|
1308
1612
|
var USER_WELCOME_EMAIL_ENDPOINT = "/api/v1/ext/users/welcome-email";
|
|
@@ -1446,7 +1750,7 @@ function createSeatMethods(deps) {
|
|
|
1446
1750
|
}
|
|
1447
1751
|
|
|
1448
1752
|
// src/client/profile-methods.ts
|
|
1449
|
-
var
|
|
1753
|
+
var EXT_PROFILE_ENDPOINT2 = "/api/v1/users/ext/me";
|
|
1450
1754
|
function resolveAuthOverride(options, createError) {
|
|
1451
1755
|
if (!options || options.accessToken === void 0) {
|
|
1452
1756
|
return {};
|
|
@@ -1467,7 +1771,7 @@ function createProfileMethods(deps) {
|
|
|
1467
1771
|
async function getProfile(options) {
|
|
1468
1772
|
const { override, error } = resolveAuthOverride(options, createError);
|
|
1469
1773
|
if (error) return { error };
|
|
1470
|
-
return fetchWithAuth(
|
|
1774
|
+
return fetchWithAuth(EXT_PROFILE_ENDPOINT2, void 0, override);
|
|
1471
1775
|
}
|
|
1472
1776
|
async function updateProfile(data, options) {
|
|
1473
1777
|
if (data === null || typeof data !== "object" || Array.isArray(data)) {
|
|
@@ -1483,7 +1787,7 @@ function createProfileMethods(deps) {
|
|
|
1483
1787
|
const { override, error } = resolveAuthOverride(options, createError);
|
|
1484
1788
|
if (error) return { error };
|
|
1485
1789
|
return fetchWithAuth(
|
|
1486
|
-
|
|
1790
|
+
EXT_PROFILE_ENDPOINT2,
|
|
1487
1791
|
{
|
|
1488
1792
|
method: "PUT",
|
|
1489
1793
|
body: JSON.stringify(data)
|
|
@@ -1676,50 +1980,6 @@ function validateTokenResponse(tokenResponse) {
|
|
|
1676
1980
|
};
|
|
1677
1981
|
}
|
|
1678
1982
|
|
|
1679
|
-
// src/client/version-check.ts
|
|
1680
|
-
var SDK_VERSION = "7.0.0";
|
|
1681
|
-
var SDK_USER_AGENT = `FFID-SDK/${SDK_VERSION} (TypeScript)`;
|
|
1682
|
-
var SDK_VERSION_HEADER = "X-FFID-SDK-Version";
|
|
1683
|
-
function sdkHeaders() {
|
|
1684
|
-
if (typeof window !== "undefined") return {};
|
|
1685
|
-
return {
|
|
1686
|
-
"User-Agent": SDK_USER_AGENT,
|
|
1687
|
-
[SDK_VERSION_HEADER]: SDK_VERSION
|
|
1688
|
-
};
|
|
1689
|
-
}
|
|
1690
|
-
var LATEST_VERSION_HEADER = "X-FFID-SDK-Latest-Version";
|
|
1691
|
-
var SEMVER_PATTERN = /^\d+(\.\d+)*$/;
|
|
1692
|
-
var _versionWarningShown = false;
|
|
1693
|
-
function compareSemver(a, b) {
|
|
1694
|
-
const cleanA = a.replace(/^v/, "");
|
|
1695
|
-
const cleanB = b.replace(/^v/, "");
|
|
1696
|
-
if (!SEMVER_PATTERN.test(cleanA) || !SEMVER_PATTERN.test(cleanB)) return 0;
|
|
1697
|
-
const partsA = cleanA.split(".").map(Number);
|
|
1698
|
-
const partsB = cleanB.split(".").map(Number);
|
|
1699
|
-
const maxLen = Math.max(partsA.length, partsB.length);
|
|
1700
|
-
for (let i = 0; i < maxLen; i++) {
|
|
1701
|
-
const numA = partsA[i] ?? 0;
|
|
1702
|
-
const numB = partsB[i] ?? 0;
|
|
1703
|
-
if (numA < numB) return -1;
|
|
1704
|
-
if (numA > numB) return 1;
|
|
1705
|
-
}
|
|
1706
|
-
return 0;
|
|
1707
|
-
}
|
|
1708
|
-
function checkVersionHeader(response, logger) {
|
|
1709
|
-
if (_versionWarningShown) return;
|
|
1710
|
-
if (typeof process !== "undefined" && process.env?.NODE_ENV === "production") return;
|
|
1711
|
-
if (!response.headers?.get) return;
|
|
1712
|
-
const latestVersion = response.headers.get(LATEST_VERSION_HEADER);
|
|
1713
|
-
if (!latestVersion) return;
|
|
1714
|
-
if (compareSemver(SDK_VERSION, latestVersion) < 0) {
|
|
1715
|
-
_versionWarningShown = true;
|
|
1716
|
-
logger.warn(
|
|
1717
|
-
`\u65B0\u3057\u3044\u30D0\u30FC\u30B8\u30E7\u30F3\u304C\u5229\u7528\u53EF\u80FD\u3067\u3059: v${latestVersion} (\u73FE\u5728: v${SDK_VERSION})
|
|
1718
|
-
npm install @feelflow/ffid-sdk@latest \u3067\u30A2\u30C3\u30D7\u30C7\u30FC\u30C8\u3067\u304D\u307E\u3059`
|
|
1719
|
-
);
|
|
1720
|
-
}
|
|
1721
|
-
}
|
|
1722
|
-
|
|
1723
1983
|
// src/client/oauth-token.ts
|
|
1724
1984
|
var OAUTH_TOKEN_ENDPOINT = "/api/v1/oauth/token";
|
|
1725
1985
|
var OAUTH_REVOKE_ENDPOINT = "/api/v1/oauth/revoke";
|
|
@@ -2635,7 +2895,7 @@ function normalizeRedirectUri(input) {
|
|
|
2635
2895
|
|
|
2636
2896
|
// src/client/password-reset.ts
|
|
2637
2897
|
var RESET_PASSWORD_BASE = "/api/v1/auth/reset-password";
|
|
2638
|
-
function
|
|
2898
|
+
function isBlank2(value) {
|
|
2639
2899
|
return !value || !value.trim();
|
|
2640
2900
|
}
|
|
2641
2901
|
function createPasswordResetMethods(deps) {
|
|
@@ -2696,7 +2956,7 @@ function createPasswordResetMethods(deps) {
|
|
|
2696
2956
|
return { data: raw.data };
|
|
2697
2957
|
}
|
|
2698
2958
|
async function requestPasswordReset(email) {
|
|
2699
|
-
if (
|
|
2959
|
+
if (isBlank2(email)) {
|
|
2700
2960
|
return {
|
|
2701
2961
|
error: createError("VALIDATION_ERROR", "\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9\u306F\u5FC5\u9808\u3067\u3059")
|
|
2702
2962
|
};
|
|
@@ -2710,7 +2970,7 @@ function createPasswordResetMethods(deps) {
|
|
|
2710
2970
|
);
|
|
2711
2971
|
}
|
|
2712
2972
|
async function verifyPasswordResetToken(accessToken) {
|
|
2713
|
-
if (
|
|
2973
|
+
if (isBlank2(accessToken)) {
|
|
2714
2974
|
return {
|
|
2715
2975
|
error: createError("VALIDATION_ERROR", "\u30A2\u30AF\u30BB\u30B9\u30C8\u30FC\u30AF\u30F3\u306F\u5FC5\u9808\u3067\u3059")
|
|
2716
2976
|
};
|
|
@@ -2724,12 +2984,12 @@ function createPasswordResetMethods(deps) {
|
|
|
2724
2984
|
);
|
|
2725
2985
|
}
|
|
2726
2986
|
async function establishResetSession(accessToken, refreshToken) {
|
|
2727
|
-
if (
|
|
2987
|
+
if (isBlank2(accessToken)) {
|
|
2728
2988
|
return {
|
|
2729
2989
|
error: createError("VALIDATION_ERROR", "\u30A2\u30AF\u30BB\u30B9\u30C8\u30FC\u30AF\u30F3\u306F\u5FC5\u9808\u3067\u3059")
|
|
2730
2990
|
};
|
|
2731
2991
|
}
|
|
2732
|
-
if (
|
|
2992
|
+
if (isBlank2(refreshToken)) {
|
|
2733
2993
|
return {
|
|
2734
2994
|
error: createError("VALIDATION_ERROR", "\u30EA\u30D5\u30EC\u30C3\u30B7\u30E5\u30C8\u30FC\u30AF\u30F3\u306F\u5FC5\u9808\u3067\u3059")
|
|
2735
2995
|
};
|
|
@@ -2743,7 +3003,7 @@ function createPasswordResetMethods(deps) {
|
|
|
2743
3003
|
);
|
|
2744
3004
|
}
|
|
2745
3005
|
async function confirmPasswordReset(password) {
|
|
2746
|
-
if (
|
|
3006
|
+
if (isBlank2(password)) {
|
|
2747
3007
|
return {
|
|
2748
3008
|
error: createError("VALIDATION_ERROR", "\u30D1\u30B9\u30EF\u30FC\u30C9\u306F\u5FC5\u9808\u3067\u3059")
|
|
2749
3009
|
};
|
|
@@ -2766,7 +3026,7 @@ function createPasswordResetMethods(deps) {
|
|
|
2766
3026
|
|
|
2767
3027
|
// src/client/otp.ts
|
|
2768
3028
|
var OTP_BASE = "/api/v1/auth/otp";
|
|
2769
|
-
function
|
|
3029
|
+
function isBlank3(value) {
|
|
2770
3030
|
return !value || !value.trim();
|
|
2771
3031
|
}
|
|
2772
3032
|
function createOtpMethods(deps) {
|
|
@@ -2827,7 +3087,7 @@ function createOtpMethods(deps) {
|
|
|
2827
3087
|
return { data: raw.data };
|
|
2828
3088
|
}
|
|
2829
3089
|
async function sendOtp(email, options) {
|
|
2830
|
-
if (
|
|
3090
|
+
if (isBlank3(email)) {
|
|
2831
3091
|
return {
|
|
2832
3092
|
error: createError("VALIDATION_ERROR", "\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9\u306F\u5FC5\u9808\u3067\u3059")
|
|
2833
3093
|
};
|
|
@@ -2844,12 +3104,12 @@ function createOtpMethods(deps) {
|
|
|
2844
3104
|
);
|
|
2845
3105
|
}
|
|
2846
3106
|
async function verifyOtp(params) {
|
|
2847
|
-
if (
|
|
3107
|
+
if (isBlank3(params.accessToken)) {
|
|
2848
3108
|
return {
|
|
2849
3109
|
error: createError("VALIDATION_ERROR", "\u30A2\u30AF\u30BB\u30B9\u30C8\u30FC\u30AF\u30F3\u306F\u5FC5\u9808\u3067\u3059")
|
|
2850
3110
|
};
|
|
2851
3111
|
}
|
|
2852
|
-
if (
|
|
3112
|
+
if (isBlank3(params.refreshToken)) {
|
|
2853
3113
|
return {
|
|
2854
3114
|
error: createError("VALIDATION_ERROR", "\u30EA\u30D5\u30EC\u30C3\u30B7\u30E5\u30C8\u30FC\u30AF\u30F3\u306F\u5FC5\u9808\u3067\u3059")
|
|
2855
3115
|
};
|
|
@@ -3415,6 +3675,12 @@ function resolveRedirectUri(raw, logger) {
|
|
|
3415
3675
|
return raw;
|
|
3416
3676
|
}
|
|
3417
3677
|
}
|
|
3678
|
+
function jsonContentTypeHeader(body) {
|
|
3679
|
+
if (typeof FormData !== "undefined" && body instanceof FormData) {
|
|
3680
|
+
return {};
|
|
3681
|
+
}
|
|
3682
|
+
return { "Content-Type": "application/json" };
|
|
3683
|
+
}
|
|
3418
3684
|
function createFFIDClient(config) {
|
|
3419
3685
|
if (!config.serviceCode || !config.serviceCode.trim()) {
|
|
3420
3686
|
throw new Error("FFID Client: serviceCode \u304C\u672A\u8A2D\u5B9A\u3067\u3059");
|
|
@@ -3467,7 +3733,7 @@ function createFFIDClient(config) {
|
|
|
3467
3733
|
...options,
|
|
3468
3734
|
credentials: "omit",
|
|
3469
3735
|
headers: {
|
|
3470
|
-
|
|
3736
|
+
...jsonContentTypeHeader(options.body),
|
|
3471
3737
|
...sdkHeaders(),
|
|
3472
3738
|
...options.headers,
|
|
3473
3739
|
Authorization: `Bearer ${authOverride.accessToken}`
|
|
@@ -3479,7 +3745,7 @@ function createFFIDClient(config) {
|
|
|
3479
3745
|
...options,
|
|
3480
3746
|
credentials: "omit",
|
|
3481
3747
|
headers: {
|
|
3482
|
-
|
|
3748
|
+
...jsonContentTypeHeader(options.body),
|
|
3483
3749
|
...sdkHeaders(),
|
|
3484
3750
|
"X-Service-Api-Key": serviceApiKey,
|
|
3485
3751
|
...options.headers
|
|
@@ -3489,7 +3755,7 @@ function createFFIDClient(config) {
|
|
|
3489
3755
|
if (authMode === "token") {
|
|
3490
3756
|
const tokens = tokenStore.getTokens();
|
|
3491
3757
|
const headers = {
|
|
3492
|
-
|
|
3758
|
+
...jsonContentTypeHeader(options.body),
|
|
3493
3759
|
...sdkHeaders(),
|
|
3494
3760
|
...options.headers
|
|
3495
3761
|
};
|
|
@@ -3506,7 +3772,7 @@ function createFFIDClient(config) {
|
|
|
3506
3772
|
...options,
|
|
3507
3773
|
credentials: "include",
|
|
3508
3774
|
headers: {
|
|
3509
|
-
|
|
3775
|
+
...jsonContentTypeHeader(options.body),
|
|
3510
3776
|
...sdkHeaders(),
|
|
3511
3777
|
...options.headers
|
|
3512
3778
|
}
|
|
@@ -3723,6 +3989,19 @@ function createFFIDClient(config) {
|
|
|
3723
3989
|
createError,
|
|
3724
3990
|
serviceCode: config.serviceCode
|
|
3725
3991
|
});
|
|
3992
|
+
const {
|
|
3993
|
+
getOrganizationProfile,
|
|
3994
|
+
upsertOrganizationProfile,
|
|
3995
|
+
uploadOrganizationLogo,
|
|
3996
|
+
getPublicLogoWall
|
|
3997
|
+
} = createOrganizationProfileMethods({
|
|
3998
|
+
fetchWithAuth,
|
|
3999
|
+
createError,
|
|
4000
|
+
authMode,
|
|
4001
|
+
baseUrl,
|
|
4002
|
+
logger,
|
|
4003
|
+
errorCodes: FFID_ERROR_CODES
|
|
4004
|
+
});
|
|
3726
4005
|
const { provisionUser, sendProvisionWelcomeEmail, provisionOrganization } = createProvisioningMethods({
|
|
3727
4006
|
fetchWithAuth,
|
|
3728
4007
|
createError,
|
|
@@ -3823,6 +4102,10 @@ function createFFIDClient(config) {
|
|
|
3823
4102
|
addMember,
|
|
3824
4103
|
updateMemberRole,
|
|
3825
4104
|
removeMember,
|
|
4105
|
+
getOrganizationProfile,
|
|
4106
|
+
upsertOrganizationProfile,
|
|
4107
|
+
uploadOrganizationLogo,
|
|
4108
|
+
getPublicLogoWall,
|
|
3826
4109
|
provisionUser,
|
|
3827
4110
|
sendProvisionWelcomeEmail,
|
|
3828
4111
|
provisionOrganization,
|
|
@@ -6027,13 +6310,19 @@ exports.FFIDProvider = FFIDProvider;
|
|
|
6027
6310
|
exports.FFIDSDKError = FFIDSDKError;
|
|
6028
6311
|
exports.FFIDSubscriptionBadge = FFIDSubscriptionBadge;
|
|
6029
6312
|
exports.FFIDUserMenu = FFIDUserMenu;
|
|
6313
|
+
exports.FFID_ALLOWED_ORGANIZATION_LOGO_MIME_TYPES = FFID_ALLOWED_ORGANIZATION_LOGO_MIME_TYPES;
|
|
6030
6314
|
exports.FFID_ANNOUNCEMENTS_ERROR_CODES = FFID_ANNOUNCEMENTS_ERROR_CODES;
|
|
6031
6315
|
exports.FFID_CATALOG_ENVIRONMENTS = FFID_CATALOG_ENVIRONMENTS;
|
|
6032
6316
|
exports.FFID_CATALOG_PUBLICATION_STATUSES = FFID_CATALOG_PUBLICATION_STATUSES;
|
|
6317
|
+
exports.FFID_COMPANY_SIZE_CODES = FFID_COMPANY_SIZE_CODES;
|
|
6033
6318
|
exports.FFID_ERROR_CODES = FFID_ERROR_CODES;
|
|
6319
|
+
exports.FFID_INDUSTRY_CODES = FFID_INDUSTRY_CODES;
|
|
6034
6320
|
exports.FFID_INQUIRY_ACQUISITION_SOURCES = FFID_INQUIRY_ACQUISITION_SOURCES;
|
|
6035
6321
|
exports.FFID_INQUIRY_CATEGORIES = FFID_INQUIRY_CATEGORIES;
|
|
6036
6322
|
exports.FFID_INQUIRY_CATEGORIES_SITE_2026 = FFID_INQUIRY_CATEGORIES_SITE_2026;
|
|
6323
|
+
exports.FFID_MAX_ORGANIZATION_LOGO_FILE_SIZE_BYTES = FFID_MAX_ORGANIZATION_LOGO_FILE_SIZE_BYTES;
|
|
6324
|
+
exports.FFID_MAX_ORGANIZATION_LOGO_FILE_SIZE_MB = FFID_MAX_ORGANIZATION_LOGO_FILE_SIZE_MB;
|
|
6325
|
+
exports.FFID_ORGANIZATION_PROFILE_ERROR_CODES = FFID_ORGANIZATION_PROFILE_ERROR_CODES;
|
|
6037
6326
|
exports.canonicalizeCatalogValue = canonicalizeCatalogValue;
|
|
6038
6327
|
exports.cleanupStateStorage = cleanupStateStorage;
|
|
6039
6328
|
exports.computeEffectiveStatusFromSession = computeEffectiveStatusFromSession;
|