connectbase-client 5.8.0 → 5.10.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/CHANGELOG.md +80 -0
- package/dist/cli.js +8 -1
- package/dist/connect-base.umd.js +4 -4
- package/dist/index.d.mts +82 -0
- package/dist/index.d.ts +82 -0
- package/dist/index.js +99 -1
- package/dist/index.mjs +99 -1
- package/package.json +75 -75
package/dist/index.d.mts
CHANGED
|
@@ -1458,6 +1458,33 @@ declare class AppMembersAPI {
|
|
|
1458
1458
|
* @param memberId 멤버 ID
|
|
1459
1459
|
*/
|
|
1460
1460
|
get(appId: string, memberId: string): Promise<AppMemberDetail>;
|
|
1461
|
+
/**
|
|
1462
|
+
* 앱 멤버를 삭제(탈퇴 처리)한다. **되돌릴 수 없다.** (management_scope: `app_member:write`)
|
|
1463
|
+
*
|
|
1464
|
+
* 멤버 행과 함께 로그인 수단(identities)이 지워지므로, 같은 소셜 계정으로 다시 로그인하면
|
|
1465
|
+
* 기존 member_id 로 되살아나지 않고 새 member_id 를 받는다. 결제·구독·푸시 디바이스·방문
|
|
1466
|
+
* 기록 등 멤버에 매달린 행도 함께 사라진다.
|
|
1467
|
+
*
|
|
1468
|
+
* 앱이 자체 테이블(`cb.database`)에 보관한 데이터는 지우지 않는다 — 같은 함수 안에서
|
|
1469
|
+
* `ctx.cbAdmin.database` 로 먼저 정리하고 마지막에 이 메서드를 부르는 순서를 권한다.
|
|
1470
|
+
*
|
|
1471
|
+
* `app_member:read` 로는 열리지 않는다 — 이메일 조회용으로 준 스코프가 회원을 지울 수 있게
|
|
1472
|
+
* 되면 안 되기 때문이다. 정지/수정/생성은 여전히 콘솔 전용이다.
|
|
1473
|
+
*
|
|
1474
|
+
* @param appId 앱 ID
|
|
1475
|
+
* @param memberId 삭제할 멤버 ID
|
|
1476
|
+
*
|
|
1477
|
+
* @example
|
|
1478
|
+
* ```typescript
|
|
1479
|
+
* // 함수(service_role, management_scopes: ["app_member:read", "app_member:write"]) 안에서
|
|
1480
|
+
* // 개인정보 삭제 요청 처리: 앱 데이터 정리 → 멤버 삭제
|
|
1481
|
+
* await ctx.cbAdmin.database.delete('posts', { author_id: memberId })
|
|
1482
|
+
* await ctx.cbAdmin.appMembers.remove(ctx.appId, memberId)
|
|
1483
|
+
* ```
|
|
1484
|
+
*/
|
|
1485
|
+
remove(appId: string, memberId: string): Promise<{
|
|
1486
|
+
message: string;
|
|
1487
|
+
}>;
|
|
1461
1488
|
}
|
|
1462
1489
|
|
|
1463
1490
|
/** 앱 멤버 회원가입 요청 */
|
|
@@ -1647,6 +1674,61 @@ declare class AuthAPI {
|
|
|
1647
1674
|
custom_data: Record<string, unknown>;
|
|
1648
1675
|
role: string;
|
|
1649
1676
|
}>;
|
|
1677
|
+
/**
|
|
1678
|
+
* Admin: 다른 멤버를 삭제(탈퇴 처리)합니다. **되돌릴 수 없습니다.**
|
|
1679
|
+
*
|
|
1680
|
+
* `adminUpdateMember` 와 같은 권한 컨텍스트입니다 — `cb_pk_` 로 앱을 식별하고 함께 보낸
|
|
1681
|
+
* `cb_sk_` 의 사용자가 그 앱에 `app_member:write` 권한을 가져야 합니다. 브라우저 번들에
|
|
1682
|
+
* 시크릿 키를 넣지 마세요. 서버(함수·백엔드)에서만 호출합니다.
|
|
1683
|
+
*
|
|
1684
|
+
* 멤버 행과 함께 **로그인 수단(identities)** 이 지워집니다. 따라서 같은 소셜 계정으로 다시
|
|
1685
|
+
* 로그인하면 기존 member_id 로 되살아나지 않고 **새 member_id** 를 받습니다. 결제·구독·
|
|
1686
|
+
* 푸시 디바이스·방문 기록 등 멤버에 매달린 행도 함께 사라집니다.
|
|
1687
|
+
*
|
|
1688
|
+
* 앱이 자체 테이블(`cb.database`)에 보관한 데이터는 지우지 않습니다 — 그건 `service_role`
|
|
1689
|
+
* 로 앱이 직접 정리하세요.
|
|
1690
|
+
*
|
|
1691
|
+
* 이미 발급된 그 멤버의 access token 은 만료(최대 1시간)까지 서명이 유효합니다. 즉시
|
|
1692
|
+
* 차단이 필요하면 삭제 전에 정지(콘솔 `멤버 정지`)를 함께 쓰세요.
|
|
1693
|
+
*
|
|
1694
|
+
* @example
|
|
1695
|
+
* ```typescript
|
|
1696
|
+
* const cb = new ConnectBase({ publicKey: 'cb_pk_...', secretKey: 'cb_sk_...' })
|
|
1697
|
+
* await cb.auth.adminDeleteMember('member-uuid')
|
|
1698
|
+
* ```
|
|
1699
|
+
*/
|
|
1700
|
+
adminDeleteMember(memberID: string): Promise<{
|
|
1701
|
+
message: string;
|
|
1702
|
+
member_id: string;
|
|
1703
|
+
}>;
|
|
1704
|
+
/**
|
|
1705
|
+
* 로그인한 본인이 스스로 탈퇴합니다. **되돌릴 수 없습니다.**
|
|
1706
|
+
*
|
|
1707
|
+
* App Store 심사 가이드라인 5.1.1(v)는 "앱 안에서 가입이 되면 앱 안에서 탈퇴도 가능해야
|
|
1708
|
+
* 한다"를 요구합니다 — 고객센터 안내로는 통과되지 않습니다. 이 메서드가 그 요구를 만족하는
|
|
1709
|
+
* 경로입니다.
|
|
1710
|
+
*
|
|
1711
|
+
* 확인 UI(“정말 탈퇴하시겠습니까?”)는 앱이 책임집니다. 서버는 확인 없이 즉시 삭제합니다.
|
|
1712
|
+
*
|
|
1713
|
+
* 성공하면 로컬 토큰이 정리되고 refresh 쿠키도 서버가 만료시킵니다 — `signOut()` 을 따로
|
|
1714
|
+
* 부를 필요가 없습니다.
|
|
1715
|
+
*
|
|
1716
|
+
* `adminDeleteMember` 와 동일하게 로그인 수단(identities)까지 지우므로, 같은 소셜 계정으로
|
|
1717
|
+
* 재가입하면 새 member_id 를 받습니다.
|
|
1718
|
+
*
|
|
1719
|
+
* @example
|
|
1720
|
+
* ```typescript
|
|
1721
|
+
* // 설정 > 회원 탈퇴 버튼
|
|
1722
|
+
* if (confirm('탈퇴하면 되돌릴 수 없습니다. 계속할까요?')) {
|
|
1723
|
+
* await cb.auth.deleteMyAccount()
|
|
1724
|
+
* location.href = '/'
|
|
1725
|
+
* }
|
|
1726
|
+
* ```
|
|
1727
|
+
*/
|
|
1728
|
+
deleteMyAccount(): Promise<{
|
|
1729
|
+
message: string;
|
|
1730
|
+
deleted: boolean;
|
|
1731
|
+
}>;
|
|
1650
1732
|
/**
|
|
1651
1733
|
* 로그아웃
|
|
1652
1734
|
*/
|
package/dist/index.d.ts
CHANGED
|
@@ -1458,6 +1458,33 @@ declare class AppMembersAPI {
|
|
|
1458
1458
|
* @param memberId 멤버 ID
|
|
1459
1459
|
*/
|
|
1460
1460
|
get(appId: string, memberId: string): Promise<AppMemberDetail>;
|
|
1461
|
+
/**
|
|
1462
|
+
* 앱 멤버를 삭제(탈퇴 처리)한다. **되돌릴 수 없다.** (management_scope: `app_member:write`)
|
|
1463
|
+
*
|
|
1464
|
+
* 멤버 행과 함께 로그인 수단(identities)이 지워지므로, 같은 소셜 계정으로 다시 로그인하면
|
|
1465
|
+
* 기존 member_id 로 되살아나지 않고 새 member_id 를 받는다. 결제·구독·푸시 디바이스·방문
|
|
1466
|
+
* 기록 등 멤버에 매달린 행도 함께 사라진다.
|
|
1467
|
+
*
|
|
1468
|
+
* 앱이 자체 테이블(`cb.database`)에 보관한 데이터는 지우지 않는다 — 같은 함수 안에서
|
|
1469
|
+
* `ctx.cbAdmin.database` 로 먼저 정리하고 마지막에 이 메서드를 부르는 순서를 권한다.
|
|
1470
|
+
*
|
|
1471
|
+
* `app_member:read` 로는 열리지 않는다 — 이메일 조회용으로 준 스코프가 회원을 지울 수 있게
|
|
1472
|
+
* 되면 안 되기 때문이다. 정지/수정/생성은 여전히 콘솔 전용이다.
|
|
1473
|
+
*
|
|
1474
|
+
* @param appId 앱 ID
|
|
1475
|
+
* @param memberId 삭제할 멤버 ID
|
|
1476
|
+
*
|
|
1477
|
+
* @example
|
|
1478
|
+
* ```typescript
|
|
1479
|
+
* // 함수(service_role, management_scopes: ["app_member:read", "app_member:write"]) 안에서
|
|
1480
|
+
* // 개인정보 삭제 요청 처리: 앱 데이터 정리 → 멤버 삭제
|
|
1481
|
+
* await ctx.cbAdmin.database.delete('posts', { author_id: memberId })
|
|
1482
|
+
* await ctx.cbAdmin.appMembers.remove(ctx.appId, memberId)
|
|
1483
|
+
* ```
|
|
1484
|
+
*/
|
|
1485
|
+
remove(appId: string, memberId: string): Promise<{
|
|
1486
|
+
message: string;
|
|
1487
|
+
}>;
|
|
1461
1488
|
}
|
|
1462
1489
|
|
|
1463
1490
|
/** 앱 멤버 회원가입 요청 */
|
|
@@ -1647,6 +1674,61 @@ declare class AuthAPI {
|
|
|
1647
1674
|
custom_data: Record<string, unknown>;
|
|
1648
1675
|
role: string;
|
|
1649
1676
|
}>;
|
|
1677
|
+
/**
|
|
1678
|
+
* Admin: 다른 멤버를 삭제(탈퇴 처리)합니다. **되돌릴 수 없습니다.**
|
|
1679
|
+
*
|
|
1680
|
+
* `adminUpdateMember` 와 같은 권한 컨텍스트입니다 — `cb_pk_` 로 앱을 식별하고 함께 보낸
|
|
1681
|
+
* `cb_sk_` 의 사용자가 그 앱에 `app_member:write` 권한을 가져야 합니다. 브라우저 번들에
|
|
1682
|
+
* 시크릿 키를 넣지 마세요. 서버(함수·백엔드)에서만 호출합니다.
|
|
1683
|
+
*
|
|
1684
|
+
* 멤버 행과 함께 **로그인 수단(identities)** 이 지워집니다. 따라서 같은 소셜 계정으로 다시
|
|
1685
|
+
* 로그인하면 기존 member_id 로 되살아나지 않고 **새 member_id** 를 받습니다. 결제·구독·
|
|
1686
|
+
* 푸시 디바이스·방문 기록 등 멤버에 매달린 행도 함께 사라집니다.
|
|
1687
|
+
*
|
|
1688
|
+
* 앱이 자체 테이블(`cb.database`)에 보관한 데이터는 지우지 않습니다 — 그건 `service_role`
|
|
1689
|
+
* 로 앱이 직접 정리하세요.
|
|
1690
|
+
*
|
|
1691
|
+
* 이미 발급된 그 멤버의 access token 은 만료(최대 1시간)까지 서명이 유효합니다. 즉시
|
|
1692
|
+
* 차단이 필요하면 삭제 전에 정지(콘솔 `멤버 정지`)를 함께 쓰세요.
|
|
1693
|
+
*
|
|
1694
|
+
* @example
|
|
1695
|
+
* ```typescript
|
|
1696
|
+
* const cb = new ConnectBase({ publicKey: 'cb_pk_...', secretKey: 'cb_sk_...' })
|
|
1697
|
+
* await cb.auth.adminDeleteMember('member-uuid')
|
|
1698
|
+
* ```
|
|
1699
|
+
*/
|
|
1700
|
+
adminDeleteMember(memberID: string): Promise<{
|
|
1701
|
+
message: string;
|
|
1702
|
+
member_id: string;
|
|
1703
|
+
}>;
|
|
1704
|
+
/**
|
|
1705
|
+
* 로그인한 본인이 스스로 탈퇴합니다. **되돌릴 수 없습니다.**
|
|
1706
|
+
*
|
|
1707
|
+
* App Store 심사 가이드라인 5.1.1(v)는 "앱 안에서 가입이 되면 앱 안에서 탈퇴도 가능해야
|
|
1708
|
+
* 한다"를 요구합니다 — 고객센터 안내로는 통과되지 않습니다. 이 메서드가 그 요구를 만족하는
|
|
1709
|
+
* 경로입니다.
|
|
1710
|
+
*
|
|
1711
|
+
* 확인 UI(“정말 탈퇴하시겠습니까?”)는 앱이 책임집니다. 서버는 확인 없이 즉시 삭제합니다.
|
|
1712
|
+
*
|
|
1713
|
+
* 성공하면 로컬 토큰이 정리되고 refresh 쿠키도 서버가 만료시킵니다 — `signOut()` 을 따로
|
|
1714
|
+
* 부를 필요가 없습니다.
|
|
1715
|
+
*
|
|
1716
|
+
* `adminDeleteMember` 와 동일하게 로그인 수단(identities)까지 지우므로, 같은 소셜 계정으로
|
|
1717
|
+
* 재가입하면 새 member_id 를 받습니다.
|
|
1718
|
+
*
|
|
1719
|
+
* @example
|
|
1720
|
+
* ```typescript
|
|
1721
|
+
* // 설정 > 회원 탈퇴 버튼
|
|
1722
|
+
* if (confirm('탈퇴하면 되돌릴 수 없습니다. 계속할까요?')) {
|
|
1723
|
+
* await cb.auth.deleteMyAccount()
|
|
1724
|
+
* location.href = '/'
|
|
1725
|
+
* }
|
|
1726
|
+
* ```
|
|
1727
|
+
*/
|
|
1728
|
+
deleteMyAccount(): Promise<{
|
|
1729
|
+
message: string;
|
|
1730
|
+
deleted: boolean;
|
|
1731
|
+
}>;
|
|
1650
1732
|
/**
|
|
1651
1733
|
* 로그아웃
|
|
1652
1734
|
*/
|
package/dist/index.js
CHANGED
|
@@ -1516,8 +1516,9 @@ var AppMembersAPI = class {
|
|
|
1516
1516
|
}
|
|
1517
1517
|
ensureServerAuth(method) {
|
|
1518
1518
|
if (this.http.hasPublicKey() && !this.http.hasJWT()) {
|
|
1519
|
+
const scope = method === "remove" ? "app_member:write" : "app_member:read";
|
|
1519
1520
|
throw new Error(
|
|
1520
|
-
`cb.appMembers.${method}() \uB294 \uCF58\uC194 JWT \uB610\uB294 service_role(ctx.cbAdmin, management_scopes: ["
|
|
1521
|
+
`cb.appMembers.${method}() \uB294 \uCF58\uC194 JWT \uB610\uB294 service_role(ctx.cbAdmin, management_scopes: ["${scope}"]) \uC778\uC99D\uC774 \uD544\uC694\uD569\uB2C8\uB2E4. Public Key(cb_pk_) \uB2E8\uB3C5 SDK \uC778\uC2A4\uD134\uC2A4\uB85C\uB294 \uD638\uCD9C\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4 \u2014 \uC790\uAE30 \uC815\uBCF4\uB294 cb.auth.getMe() \uB97C \uC4F0\uACE0, \uBCF8\uC778 \uD0C8\uD1F4\uB294 cb.auth.deleteMyAccount() \uB97C \uC4F0\uC138\uC694.`
|
|
1521
1522
|
);
|
|
1522
1523
|
}
|
|
1523
1524
|
}
|
|
@@ -1552,6 +1553,36 @@ var AppMembersAPI = class {
|
|
|
1552
1553
|
`/v1/apps/${appId}/app-members/${memberId}`
|
|
1553
1554
|
);
|
|
1554
1555
|
}
|
|
1556
|
+
/**
|
|
1557
|
+
* 앱 멤버를 삭제(탈퇴 처리)한다. **되돌릴 수 없다.** (management_scope: `app_member:write`)
|
|
1558
|
+
*
|
|
1559
|
+
* 멤버 행과 함께 로그인 수단(identities)이 지워지므로, 같은 소셜 계정으로 다시 로그인하면
|
|
1560
|
+
* 기존 member_id 로 되살아나지 않고 새 member_id 를 받는다. 결제·구독·푸시 디바이스·방문
|
|
1561
|
+
* 기록 등 멤버에 매달린 행도 함께 사라진다.
|
|
1562
|
+
*
|
|
1563
|
+
* 앱이 자체 테이블(`cb.database`)에 보관한 데이터는 지우지 않는다 — 같은 함수 안에서
|
|
1564
|
+
* `ctx.cbAdmin.database` 로 먼저 정리하고 마지막에 이 메서드를 부르는 순서를 권한다.
|
|
1565
|
+
*
|
|
1566
|
+
* `app_member:read` 로는 열리지 않는다 — 이메일 조회용으로 준 스코프가 회원을 지울 수 있게
|
|
1567
|
+
* 되면 안 되기 때문이다. 정지/수정/생성은 여전히 콘솔 전용이다.
|
|
1568
|
+
*
|
|
1569
|
+
* @param appId 앱 ID
|
|
1570
|
+
* @param memberId 삭제할 멤버 ID
|
|
1571
|
+
*
|
|
1572
|
+
* @example
|
|
1573
|
+
* ```typescript
|
|
1574
|
+
* // 함수(service_role, management_scopes: ["app_member:read", "app_member:write"]) 안에서
|
|
1575
|
+
* // 개인정보 삭제 요청 처리: 앱 데이터 정리 → 멤버 삭제
|
|
1576
|
+
* await ctx.cbAdmin.database.delete('posts', { author_id: memberId })
|
|
1577
|
+
* await ctx.cbAdmin.appMembers.remove(ctx.appId, memberId)
|
|
1578
|
+
* ```
|
|
1579
|
+
*/
|
|
1580
|
+
async remove(appId, memberId) {
|
|
1581
|
+
this.ensureServerAuth("remove");
|
|
1582
|
+
return this.http.delete(
|
|
1583
|
+
`/v1/apps/${appId}/app-members/${memberId}`
|
|
1584
|
+
);
|
|
1585
|
+
}
|
|
1555
1586
|
};
|
|
1556
1587
|
|
|
1557
1588
|
// src/core/validate.ts
|
|
@@ -1804,6 +1835,73 @@ var AuthAPI = class {
|
|
|
1804
1835
|
fields
|
|
1805
1836
|
);
|
|
1806
1837
|
}
|
|
1838
|
+
/**
|
|
1839
|
+
* Admin: 다른 멤버를 삭제(탈퇴 처리)합니다. **되돌릴 수 없습니다.**
|
|
1840
|
+
*
|
|
1841
|
+
* `adminUpdateMember` 와 같은 권한 컨텍스트입니다 — `cb_pk_` 로 앱을 식별하고 함께 보낸
|
|
1842
|
+
* `cb_sk_` 의 사용자가 그 앱에 `app_member:write` 권한을 가져야 합니다. 브라우저 번들에
|
|
1843
|
+
* 시크릿 키를 넣지 마세요. 서버(함수·백엔드)에서만 호출합니다.
|
|
1844
|
+
*
|
|
1845
|
+
* 멤버 행과 함께 **로그인 수단(identities)** 이 지워집니다. 따라서 같은 소셜 계정으로 다시
|
|
1846
|
+
* 로그인하면 기존 member_id 로 되살아나지 않고 **새 member_id** 를 받습니다. 결제·구독·
|
|
1847
|
+
* 푸시 디바이스·방문 기록 등 멤버에 매달린 행도 함께 사라집니다.
|
|
1848
|
+
*
|
|
1849
|
+
* 앱이 자체 테이블(`cb.database`)에 보관한 데이터는 지우지 않습니다 — 그건 `service_role`
|
|
1850
|
+
* 로 앱이 직접 정리하세요.
|
|
1851
|
+
*
|
|
1852
|
+
* 이미 발급된 그 멤버의 access token 은 만료(최대 1시간)까지 서명이 유효합니다. 즉시
|
|
1853
|
+
* 차단이 필요하면 삭제 전에 정지(콘솔 `멤버 정지`)를 함께 쓰세요.
|
|
1854
|
+
*
|
|
1855
|
+
* @example
|
|
1856
|
+
* ```typescript
|
|
1857
|
+
* const cb = new ConnectBase({ publicKey: 'cb_pk_...', secretKey: 'cb_sk_...' })
|
|
1858
|
+
* await cb.auth.adminDeleteMember('member-uuid')
|
|
1859
|
+
* ```
|
|
1860
|
+
*/
|
|
1861
|
+
async adminDeleteMember(memberID) {
|
|
1862
|
+
if (!this.http.getSecretKey()) {
|
|
1863
|
+
throw new Error(
|
|
1864
|
+
"adminDeleteMember requires a secretKey. Initialize ConnectBase with both publicKey and secretKey."
|
|
1865
|
+
);
|
|
1866
|
+
}
|
|
1867
|
+
return this.http.delete(
|
|
1868
|
+
`/v1/public/app-members/${encodeURIComponent(memberID)}`
|
|
1869
|
+
);
|
|
1870
|
+
}
|
|
1871
|
+
/**
|
|
1872
|
+
* 로그인한 본인이 스스로 탈퇴합니다. **되돌릴 수 없습니다.**
|
|
1873
|
+
*
|
|
1874
|
+
* App Store 심사 가이드라인 5.1.1(v)는 "앱 안에서 가입이 되면 앱 안에서 탈퇴도 가능해야
|
|
1875
|
+
* 한다"를 요구합니다 — 고객센터 안내로는 통과되지 않습니다. 이 메서드가 그 요구를 만족하는
|
|
1876
|
+
* 경로입니다.
|
|
1877
|
+
*
|
|
1878
|
+
* 확인 UI(“정말 탈퇴하시겠습니까?”)는 앱이 책임집니다. 서버는 확인 없이 즉시 삭제합니다.
|
|
1879
|
+
*
|
|
1880
|
+
* 성공하면 로컬 토큰이 정리되고 refresh 쿠키도 서버가 만료시킵니다 — `signOut()` 을 따로
|
|
1881
|
+
* 부를 필요가 없습니다.
|
|
1882
|
+
*
|
|
1883
|
+
* `adminDeleteMember` 와 동일하게 로그인 수단(identities)까지 지우므로, 같은 소셜 계정으로
|
|
1884
|
+
* 재가입하면 새 member_id 를 받습니다.
|
|
1885
|
+
*
|
|
1886
|
+
* @example
|
|
1887
|
+
* ```typescript
|
|
1888
|
+
* // 설정 > 회원 탈퇴 버튼
|
|
1889
|
+
* if (confirm('탈퇴하면 되돌릴 수 없습니다. 계속할까요?')) {
|
|
1890
|
+
* await cb.auth.deleteMyAccount()
|
|
1891
|
+
* location.href = '/'
|
|
1892
|
+
* }
|
|
1893
|
+
* ```
|
|
1894
|
+
*/
|
|
1895
|
+
async deleteMyAccount() {
|
|
1896
|
+
try {
|
|
1897
|
+
return await this.http.delete(
|
|
1898
|
+
"/v1/public/app-members/me"
|
|
1899
|
+
);
|
|
1900
|
+
} finally {
|
|
1901
|
+
this.http.clearTokens();
|
|
1902
|
+
this.notifyVisitorTracker(null);
|
|
1903
|
+
}
|
|
1904
|
+
}
|
|
1807
1905
|
/**
|
|
1808
1906
|
* 로그아웃
|
|
1809
1907
|
*/
|
package/dist/index.mjs
CHANGED
|
@@ -1467,8 +1467,9 @@ var AppMembersAPI = class {
|
|
|
1467
1467
|
}
|
|
1468
1468
|
ensureServerAuth(method) {
|
|
1469
1469
|
if (this.http.hasPublicKey() && !this.http.hasJWT()) {
|
|
1470
|
+
const scope = method === "remove" ? "app_member:write" : "app_member:read";
|
|
1470
1471
|
throw new Error(
|
|
1471
|
-
`cb.appMembers.${method}() \uB294 \uCF58\uC194 JWT \uB610\uB294 service_role(ctx.cbAdmin, management_scopes: ["
|
|
1472
|
+
`cb.appMembers.${method}() \uB294 \uCF58\uC194 JWT \uB610\uB294 service_role(ctx.cbAdmin, management_scopes: ["${scope}"]) \uC778\uC99D\uC774 \uD544\uC694\uD569\uB2C8\uB2E4. Public Key(cb_pk_) \uB2E8\uB3C5 SDK \uC778\uC2A4\uD134\uC2A4\uB85C\uB294 \uD638\uCD9C\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4 \u2014 \uC790\uAE30 \uC815\uBCF4\uB294 cb.auth.getMe() \uB97C \uC4F0\uACE0, \uBCF8\uC778 \uD0C8\uD1F4\uB294 cb.auth.deleteMyAccount() \uB97C \uC4F0\uC138\uC694.`
|
|
1472
1473
|
);
|
|
1473
1474
|
}
|
|
1474
1475
|
}
|
|
@@ -1503,6 +1504,36 @@ var AppMembersAPI = class {
|
|
|
1503
1504
|
`/v1/apps/${appId}/app-members/${memberId}`
|
|
1504
1505
|
);
|
|
1505
1506
|
}
|
|
1507
|
+
/**
|
|
1508
|
+
* 앱 멤버를 삭제(탈퇴 처리)한다. **되돌릴 수 없다.** (management_scope: `app_member:write`)
|
|
1509
|
+
*
|
|
1510
|
+
* 멤버 행과 함께 로그인 수단(identities)이 지워지므로, 같은 소셜 계정으로 다시 로그인하면
|
|
1511
|
+
* 기존 member_id 로 되살아나지 않고 새 member_id 를 받는다. 결제·구독·푸시 디바이스·방문
|
|
1512
|
+
* 기록 등 멤버에 매달린 행도 함께 사라진다.
|
|
1513
|
+
*
|
|
1514
|
+
* 앱이 자체 테이블(`cb.database`)에 보관한 데이터는 지우지 않는다 — 같은 함수 안에서
|
|
1515
|
+
* `ctx.cbAdmin.database` 로 먼저 정리하고 마지막에 이 메서드를 부르는 순서를 권한다.
|
|
1516
|
+
*
|
|
1517
|
+
* `app_member:read` 로는 열리지 않는다 — 이메일 조회용으로 준 스코프가 회원을 지울 수 있게
|
|
1518
|
+
* 되면 안 되기 때문이다. 정지/수정/생성은 여전히 콘솔 전용이다.
|
|
1519
|
+
*
|
|
1520
|
+
* @param appId 앱 ID
|
|
1521
|
+
* @param memberId 삭제할 멤버 ID
|
|
1522
|
+
*
|
|
1523
|
+
* @example
|
|
1524
|
+
* ```typescript
|
|
1525
|
+
* // 함수(service_role, management_scopes: ["app_member:read", "app_member:write"]) 안에서
|
|
1526
|
+
* // 개인정보 삭제 요청 처리: 앱 데이터 정리 → 멤버 삭제
|
|
1527
|
+
* await ctx.cbAdmin.database.delete('posts', { author_id: memberId })
|
|
1528
|
+
* await ctx.cbAdmin.appMembers.remove(ctx.appId, memberId)
|
|
1529
|
+
* ```
|
|
1530
|
+
*/
|
|
1531
|
+
async remove(appId, memberId) {
|
|
1532
|
+
this.ensureServerAuth("remove");
|
|
1533
|
+
return this.http.delete(
|
|
1534
|
+
`/v1/apps/${appId}/app-members/${memberId}`
|
|
1535
|
+
);
|
|
1536
|
+
}
|
|
1506
1537
|
};
|
|
1507
1538
|
|
|
1508
1539
|
// src/core/validate.ts
|
|
@@ -1755,6 +1786,73 @@ var AuthAPI = class {
|
|
|
1755
1786
|
fields
|
|
1756
1787
|
);
|
|
1757
1788
|
}
|
|
1789
|
+
/**
|
|
1790
|
+
* Admin: 다른 멤버를 삭제(탈퇴 처리)합니다. **되돌릴 수 없습니다.**
|
|
1791
|
+
*
|
|
1792
|
+
* `adminUpdateMember` 와 같은 권한 컨텍스트입니다 — `cb_pk_` 로 앱을 식별하고 함께 보낸
|
|
1793
|
+
* `cb_sk_` 의 사용자가 그 앱에 `app_member:write` 권한을 가져야 합니다. 브라우저 번들에
|
|
1794
|
+
* 시크릿 키를 넣지 마세요. 서버(함수·백엔드)에서만 호출합니다.
|
|
1795
|
+
*
|
|
1796
|
+
* 멤버 행과 함께 **로그인 수단(identities)** 이 지워집니다. 따라서 같은 소셜 계정으로 다시
|
|
1797
|
+
* 로그인하면 기존 member_id 로 되살아나지 않고 **새 member_id** 를 받습니다. 결제·구독·
|
|
1798
|
+
* 푸시 디바이스·방문 기록 등 멤버에 매달린 행도 함께 사라집니다.
|
|
1799
|
+
*
|
|
1800
|
+
* 앱이 자체 테이블(`cb.database`)에 보관한 데이터는 지우지 않습니다 — 그건 `service_role`
|
|
1801
|
+
* 로 앱이 직접 정리하세요.
|
|
1802
|
+
*
|
|
1803
|
+
* 이미 발급된 그 멤버의 access token 은 만료(최대 1시간)까지 서명이 유효합니다. 즉시
|
|
1804
|
+
* 차단이 필요하면 삭제 전에 정지(콘솔 `멤버 정지`)를 함께 쓰세요.
|
|
1805
|
+
*
|
|
1806
|
+
* @example
|
|
1807
|
+
* ```typescript
|
|
1808
|
+
* const cb = new ConnectBase({ publicKey: 'cb_pk_...', secretKey: 'cb_sk_...' })
|
|
1809
|
+
* await cb.auth.adminDeleteMember('member-uuid')
|
|
1810
|
+
* ```
|
|
1811
|
+
*/
|
|
1812
|
+
async adminDeleteMember(memberID) {
|
|
1813
|
+
if (!this.http.getSecretKey()) {
|
|
1814
|
+
throw new Error(
|
|
1815
|
+
"adminDeleteMember requires a secretKey. Initialize ConnectBase with both publicKey and secretKey."
|
|
1816
|
+
);
|
|
1817
|
+
}
|
|
1818
|
+
return this.http.delete(
|
|
1819
|
+
`/v1/public/app-members/${encodeURIComponent(memberID)}`
|
|
1820
|
+
);
|
|
1821
|
+
}
|
|
1822
|
+
/**
|
|
1823
|
+
* 로그인한 본인이 스스로 탈퇴합니다. **되돌릴 수 없습니다.**
|
|
1824
|
+
*
|
|
1825
|
+
* App Store 심사 가이드라인 5.1.1(v)는 "앱 안에서 가입이 되면 앱 안에서 탈퇴도 가능해야
|
|
1826
|
+
* 한다"를 요구합니다 — 고객센터 안내로는 통과되지 않습니다. 이 메서드가 그 요구를 만족하는
|
|
1827
|
+
* 경로입니다.
|
|
1828
|
+
*
|
|
1829
|
+
* 확인 UI(“정말 탈퇴하시겠습니까?”)는 앱이 책임집니다. 서버는 확인 없이 즉시 삭제합니다.
|
|
1830
|
+
*
|
|
1831
|
+
* 성공하면 로컬 토큰이 정리되고 refresh 쿠키도 서버가 만료시킵니다 — `signOut()` 을 따로
|
|
1832
|
+
* 부를 필요가 없습니다.
|
|
1833
|
+
*
|
|
1834
|
+
* `adminDeleteMember` 와 동일하게 로그인 수단(identities)까지 지우므로, 같은 소셜 계정으로
|
|
1835
|
+
* 재가입하면 새 member_id 를 받습니다.
|
|
1836
|
+
*
|
|
1837
|
+
* @example
|
|
1838
|
+
* ```typescript
|
|
1839
|
+
* // 설정 > 회원 탈퇴 버튼
|
|
1840
|
+
* if (confirm('탈퇴하면 되돌릴 수 없습니다. 계속할까요?')) {
|
|
1841
|
+
* await cb.auth.deleteMyAccount()
|
|
1842
|
+
* location.href = '/'
|
|
1843
|
+
* }
|
|
1844
|
+
* ```
|
|
1845
|
+
*/
|
|
1846
|
+
async deleteMyAccount() {
|
|
1847
|
+
try {
|
|
1848
|
+
return await this.http.delete(
|
|
1849
|
+
"/v1/public/app-members/me"
|
|
1850
|
+
);
|
|
1851
|
+
} finally {
|
|
1852
|
+
this.http.clearTokens();
|
|
1853
|
+
this.notifyVisitorTracker(null);
|
|
1854
|
+
}
|
|
1855
|
+
}
|
|
1758
1856
|
/**
|
|
1759
1857
|
* 로그아웃
|
|
1760
1858
|
*/
|
package/package.json
CHANGED
|
@@ -1,77 +1,77 @@
|
|
|
1
1
|
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
2
|
+
"name": "connectbase-client",
|
|
3
|
+
"version": "5.10.0",
|
|
4
|
+
"description": "Connect Base JavaScript/TypeScript SDK for browser and Node.js",
|
|
5
|
+
"repository": {
|
|
6
|
+
"type": "git",
|
|
7
|
+
"url": "git+https://github.com/connectbase-world/connectbase.git",
|
|
8
|
+
"directory": "frontend/package/public/connect-base-client"
|
|
9
|
+
},
|
|
10
|
+
"homepage": "https://github.com/connectbase-world/connectbase/tree/release/frontend/package/public/connect-base-client#readme",
|
|
11
|
+
"bugs": {
|
|
12
|
+
"url": "https://github.com/connectbase-world/connectbase/issues"
|
|
13
|
+
},
|
|
14
|
+
"publishConfig": {
|
|
15
|
+
"access": "public"
|
|
16
|
+
},
|
|
17
|
+
"sideEffects": false,
|
|
18
|
+
"main": "dist/index.js",
|
|
19
|
+
"module": "dist/index.mjs",
|
|
20
|
+
"types": "dist/index.d.ts",
|
|
21
|
+
"browser": "dist/connect-base.umd.js",
|
|
22
|
+
"unpkg": "dist/connect-base.umd.js",
|
|
23
|
+
"bin": {
|
|
24
|
+
"connectbase": "dist/cli.js",
|
|
25
|
+
"connectbase-client": "dist/cli.js"
|
|
26
|
+
},
|
|
27
|
+
"exports": {
|
|
28
|
+
".": {
|
|
29
|
+
"types": "./dist/index.d.ts",
|
|
30
|
+
"import": "./dist/index.mjs",
|
|
31
|
+
"require": "./dist/index.js"
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
"files": [
|
|
35
|
+
"dist",
|
|
36
|
+
"LICENSE",
|
|
37
|
+
"CHANGELOG.md",
|
|
38
|
+
"README.md",
|
|
39
|
+
"MIGRATION-v2.md"
|
|
40
|
+
],
|
|
41
|
+
"scripts": {
|
|
42
|
+
"build": "tsup",
|
|
43
|
+
"dev": "tsup --watch",
|
|
44
|
+
"typecheck": "tsc --noEmit",
|
|
45
|
+
"test": "vitest run",
|
|
46
|
+
"test:types": "tsc --noEmit -p test/tsconfig.json",
|
|
47
|
+
"release": "pnpm build && npm publish --access public",
|
|
48
|
+
"lint": "biome lint .",
|
|
49
|
+
"format": "biome format --write .",
|
|
50
|
+
"check": "biome check ."
|
|
51
|
+
},
|
|
52
|
+
"keywords": [
|
|
53
|
+
"connect-base",
|
|
54
|
+
"baas",
|
|
55
|
+
"backend-as-a-service",
|
|
56
|
+
"database",
|
|
57
|
+
"storage",
|
|
58
|
+
"sdk",
|
|
59
|
+
"cli",
|
|
60
|
+
"deploy",
|
|
61
|
+
"ai",
|
|
62
|
+
"streaming",
|
|
63
|
+
"realtime",
|
|
64
|
+
"tunnel"
|
|
65
|
+
],
|
|
66
|
+
"author": "Connect Base",
|
|
67
|
+
"license": "MIT",
|
|
68
|
+
"devDependencies": {
|
|
69
|
+
"@types/node": "^22.15.18",
|
|
70
|
+
"tsup": "^8.5.1",
|
|
71
|
+
"typescript": "^5.9.3",
|
|
72
|
+
"vitest": "^3.2.4"
|
|
73
|
+
},
|
|
74
|
+
"engines": {
|
|
75
|
+
"node": ">=16"
|
|
76
|
+
}
|
|
77
77
|
}
|