feat(EntitlementManager): Support get entitlement (#10606)

* feat: support get entitlement

* docs: add return type

Co-authored-by: Danial Raza <danialrazafb@gmail.com>

* fix: property typo

Co-authored-by: Almeida <github@almeidx.dev>

* fix: property typo

Co-authored-by: Almeida <github@almeidx.dev>

---------

Co-authored-by: Danial Raza <danialrazafb@gmail.com>
Co-authored-by: Almeida <github@almeidx.dev>
Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
This commit is contained in:
Jiralite
2024-12-05 15:55:50 +00:00
parent 7678f1176a
commit a367e2c8c9
2 changed files with 44 additions and 3 deletions

View File

@@ -37,6 +37,12 @@ class EntitlementManager extends CachedManager {
* @typedef {SKU|Snowflake} SKUResolvable * @typedef {SKU|Snowflake} SKUResolvable
*/ */
/**
* Options used to fetch an entitlement
* @typedef {BaseFetchOptions} FetchEntitlementOptions
* @property {EntitlementResolvable} entitlement The entitlement to fetch
*/
/** /**
* Options used to fetch entitlements * Options used to fetch entitlements
* @typedef {Object} FetchEntitlementsOptions * @typedef {Object} FetchEntitlementsOptions
@@ -45,6 +51,7 @@ class EntitlementManager extends CachedManager {
* @property {UserResolvable} [user] The user to fetch entitlements for * @property {UserResolvable} [user] The user to fetch entitlements for
* @property {SKUResolvable[]} [skus] The SKUs to fetch entitlements for * @property {SKUResolvable[]} [skus] The SKUs to fetch entitlements for
* @property {boolean} [excludeEnded] Whether to exclude ended entitlements * @property {boolean} [excludeEnded] Whether to exclude ended entitlements
* @property {boolean} [excludeDeleted] Whether to exclude deleted entitlements
* @property {boolean} [cache=true] Whether to cache the fetched entitlements * @property {boolean} [cache=true] Whether to cache the fetched entitlements
* @property {Snowflake} [before] Consider only entitlements before this entitlement id * @property {Snowflake} [before] Consider only entitlements before this entitlement id
* @property {Snowflake} [after] Consider only entitlements after this entitlement id * @property {Snowflake} [after] Consider only entitlements after this entitlement id
@@ -53,21 +60,49 @@ class EntitlementManager extends CachedManager {
/** /**
* Fetches entitlements for this application * Fetches entitlements for this application
* @param {FetchEntitlementsOptions} [options={}] Options for fetching the entitlements * @param {EntitlementResolvable|FetchEntitlementOptions|FetchEntitlementsOptions} [options]
* @returns {Promise<Collection<Snowflake, Entitlement>>} * Options for fetching the entitlements
* @returns {Promise<Entitlement|Collection<Snowflake, Entitlement>>}
*/ */
async fetch({ limit, guild, user, skus, excludeEnded, cache = true, before, after } = {}) { async fetch(options) {
if (!options) return this._fetchMany(options);
const { entitlement, cache, force } = options;
const resolvedEntitlement = this.resolveId(entitlement ?? options);
if (resolvedEntitlement) {
return this._fetchSingle({ entitlement: resolvedEntitlement, cache, force });
}
return this._fetchMany(options);
}
async _fetchSingle({ entitlement, cache, force = false }) {
if (!force) {
const existing = this.cache.get(entitlement);
if (existing) {
return existing;
}
}
const data = await this.client.rest.get(Routes.entitlement(this.client.application.id, entitlement));
return this._add(data, cache);
}
async _fetchMany({ limit, guild, user, skus, excludeEnded, excludeDeleted, cache, before, after } = {}) {
const query = makeURLSearchParams({ const query = makeURLSearchParams({
limit, limit,
guild_id: guild && this.client.guilds.resolveId(guild), guild_id: guild && this.client.guilds.resolveId(guild),
user_id: user && this.client.users.resolveId(user), user_id: user && this.client.users.resolveId(user),
sku_ids: skus?.map(sku => resolveSKUId(sku)).join(','), sku_ids: skus?.map(sku => resolveSKUId(sku)).join(','),
exclude_ended: excludeEnded, exclude_ended: excludeEnded,
exclude_deleted: excludeDeleted,
before, before,
after, after,
}); });
const entitlements = await this.client.rest.get(Routes.entitlements(this.client.application.id), { query }); const entitlements = await this.client.rest.get(Routes.entitlements(this.client.application.id), { query });
return entitlements.reduce( return entitlements.reduce(
(coll, entitlement) => coll.set(entitlement.id, this._add(entitlement, cache)), (coll, entitlement) => coll.set(entitlement.id, this._add(entitlement, cache)),
new Collection(), new Collection(),

View File

@@ -4336,12 +4336,17 @@ export interface UserEntitlementCreateOptions {
user: UserResolvable; user: UserResolvable;
} }
export interface FetchEntitlementOptions extends BaseFetchOptions {
entitlement: EntitlementResolvable;
}
export interface FetchEntitlementsOptions { export interface FetchEntitlementsOptions {
limit?: number; limit?: number;
guild?: GuildResolvable; guild?: GuildResolvable;
user?: UserResolvable; user?: UserResolvable;
skus?: readonly SKUResolvable[]; skus?: readonly SKUResolvable[];
excludeEnded?: boolean; excludeEnded?: boolean;
excludeDeleted?: boolean;
cache?: boolean; cache?: boolean;
before?: Snowflake; before?: Snowflake;
after?: Snowflake; after?: Snowflake;
@@ -4349,6 +4354,7 @@ export interface FetchEntitlementsOptions {
export class EntitlementManager extends CachedManager<Snowflake, Entitlement, EntitlementResolvable> { export class EntitlementManager extends CachedManager<Snowflake, Entitlement, EntitlementResolvable> {
private constructor(client: Client<true>, iterable: Iterable<APIEntitlement>); private constructor(client: Client<true>, iterable: Iterable<APIEntitlement>);
public fetch(options: EntitlementResolvable | FetchEntitlementOptions): Promise<Entitlement>;
public fetch(options?: FetchEntitlementsOptions): Promise<Collection<Snowflake, Entitlement>>; public fetch(options?: FetchEntitlementsOptions): Promise<Collection<Snowflake, Entitlement>>;
public createTest(options: GuildEntitlementCreateOptions | UserEntitlementCreateOptions): Promise<Entitlement>; public createTest(options: GuildEntitlementCreateOptions | UserEntitlementCreateOptions): Promise<Entitlement>;
public deleteTest(entitlement: EntitlementResolvable): Promise<void>; public deleteTest(entitlement: EntitlementResolvable): Promise<void>;