Skip to content

Commit

Permalink
feat: Completely redo all Favro Api types into the FavroApi namespace.
Browse files Browse the repository at this point in the history
BREAKING
  • Loading branch information
adam-coster committed Aug 29, 2021
1 parent f6a3dd7 commit 076f992
Show file tree
Hide file tree
Showing 16 changed files with 699 additions and 713 deletions.
53 changes: 23 additions & 30 deletions src/lib/BravoClient.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,24 +16,16 @@ import { BravoCollection } from './entities/BravoCollection';
import { BravoUser } from '$/lib/entities/BravoUser';
import { BravoOrganization } from '$entities/BravoOrganization';
import { BravoWidget } from '$entities/BravoWidget.js';
import type { FavroApi } from '$favro';
import { BravoColumn } from './entities/BravoColumn.js';
import type { ArrayMatchFunction, RequiredBy } from '$/types/Utility.js';
import type {
DataFavroCard,
DataFavroCardAttachment,
FavroApiGetCardsParams,
FavroApiParamsCardCreate,
} from '$/types/FavroCardTypes.js';
import { BravoCardInstance } from './entities/BravoCard.js';
import { BravoCustomFieldDefinition } from './entities/BravoCustomField.js';
import type { DataFavroCustomFieldDefinition } from '$/types/FavroCustomFieldTypes.js';
import type { FavroApiParamsCardUpdate } from '$/types/FavroCardUpdateTypes.js';
import type { FavroResponse } from './clientLib/FavroResponse.js';
import { readFileSync } from 'fs';
import { basename } from 'path';
import { BravoTagDefinition } from './entities/BravoTag.js';
import type { BravoEntity } from './BravoEntity.js';
import type { FavroApi } from '$favro';

type ConstructorFavroEntity<EntityData extends Record<string, any>> = new (
client: BravoClient,
Expand Down Expand Up @@ -179,12 +171,12 @@ export class BravoClient extends FavroClient {
async createCollection(
name: string,
options?: {
publicSharing?: FavroApi.Collection.FieldTypes.Visibility;
background?: FavroApi.Collection.FieldTypes.ColorBackground;
publicSharing?: FavroApi.Collection.ModelFieldValue.Visibility;
background?: FavroApi.Collection.ModelFieldValue.ColorBackground;
sharedToUsers?: {
email?: string;
userId?: string;
role: FavroApi.Collection.FieldTypes.Role;
role: FavroApi.Collection.ModelFieldValue.Role;
}[];
},
) {
Expand Down Expand Up @@ -309,7 +301,7 @@ export class BravoClient extends FavroClient {
'widgets',
{ method: 'get', query: { collectionId } },
BravoWidget,
)) as BravoResponseEntities<FavroApi.Widget.Data, BravoWidget>;
)) as BravoResponseEntities<FavroApi.Widget.Model, BravoWidget>;
this.cache.setWidgets(res, collectionId);
}
return this.cache.getWidgets(collectionId)!;
Expand Down Expand Up @@ -451,7 +443,7 @@ export class BravoClient extends FavroClient {
`columns`,
{ method: 'get', query: { widgetCommonId } },
BravoColumn,
)) as BravoResponseEntities<FavroApi.Column.Data, BravoColumn>;
)) as BravoResponseEntities<FavroApi.Column.Model, BravoColumn>;
const columns = await res.getAllEntities();
this.cache.setColumns(widgetCommonId, columns);
}
Expand Down Expand Up @@ -496,7 +488,7 @@ export class BravoClient extends FavroClient {
*
* {@link https://favro.com/developer/#create-a-card}
*/
async createCard(data: FavroApiParamsCardCreate) {
async createCard(data: FavroApi.Card.CreateBody) {
const res = await this.requestWithReturnedEntities(
`cards`,
{
Expand All @@ -520,18 +512,18 @@ export class BravoClient extends FavroClient {
*
* {@link https://favro.com/developer/#get-all-cards}
*/
async listCardInstances(options?: FavroApiGetCardsParams) {
async listCardInstances(options?: FavroApi.Card.SearchQuery) {
const res = (await this.requestWithReturnedEntities(
`cards`,
{
method: 'get',
query: {
descriptionFormat: 'markdown',
...options,
} as FavroApiGetCardsParams,
} as FavroApi.Card.SearchQuery,
},
BravoCardInstance,
)) as BravoResponseEntities<DataFavroCard, BravoCardInstance>;
)) as BravoResponseEntities<FavroApi.Card.Model, BravoCardInstance>;
return res;
}

Expand Down Expand Up @@ -565,10 +557,10 @@ export class BravoClient extends FavroClient {
method: 'get',
query: {
descriptionFormat: 'markdown',
} as FavroApiGetCardsParams,
} as FavroApi.Card.SearchQuery,
},
BravoCardInstance,
)) as BravoResponseEntities<DataFavroCard, BravoCardInstance>;
)) as BravoResponseEntities<FavroApi.Card.Model, BravoCardInstance>;
return await res.getFirstEntity();
}

Expand All @@ -586,7 +578,7 @@ export class BravoClient extends FavroClient {
*/
async updateCardInstanceByCardId(
cardId: string,
options: FavroApiParamsCardUpdate,
options: FavroApi.Card.UpdateBody,
) {
const res = (await this.requestWithReturnedEntities(
`cards/${cardId}`,
Expand All @@ -598,7 +590,7 @@ export class BravoClient extends FavroClient {
body: options,
},
BravoCardInstance,
)) as BravoResponseEntities<DataFavroCard, BravoCardInstance>;
)) as BravoResponseEntities<FavroApi.Card.Model, BravoCardInstance>;
return await res.getFirstEntity();
}

Expand All @@ -617,8 +609,9 @@ export class BravoClient extends FavroClient {
method: 'post',
body,
query: { filename: basename(filename) },
})) as FavroResponse<DataFavroCardAttachment, this>;
const attachment = (await res.getParsedBody()) as DataFavroCardAttachment;
})) as FavroResponse<FavroApi.Card.ModelFieldValue.Attachment, this>;
const attachment =
(await res.getParsedBody()) as FavroApi.Card.ModelFieldValue.Attachment;
assertBravoClaim(attachment?.fileURL, `Failed to add attachment`);
return attachment;
}
Expand Down Expand Up @@ -654,14 +647,14 @@ export class BravoClient extends FavroClient {
`tags`,
{ method: 'get' },
BravoTagDefinition,
)) as BravoResponseEntities<FavroApi.Tag.Data, BravoTagDefinition>;
)) as BravoResponseEntities<FavroApi.Tag.Model, BravoTagDefinition>;
this.cache.tags = res;
}
return this.cache.tags!;
}

async createTagDefinition(
options: Partial<Omit<FavroApi.Tag.Data, 'tagId' | 'organizationId'>>,
options: Partial<Omit<FavroApi.Tag.Model, 'tagId' | 'organizationId'>>,
) {
const res = (await this.requestWithReturnedEntities(
`tags`,
Expand All @@ -670,13 +663,13 @@ export class BravoClient extends FavroClient {
body: options,
},
BravoTagDefinition,
)) as BravoResponseEntities<FavroApi.Tag.Data, BravoTagDefinition>;
)) as BravoResponseEntities<FavroApi.Tag.Model, BravoTagDefinition>;
return await res.getFirstEntity();
}

async updateTagDefinition(
options: RequiredBy<
Partial<Omit<FavroApi.Tag.Data, 'organizationId'>>,
Partial<Omit<FavroApi.Tag.Model, 'organizationId'>>,
'tagId'
>,
) {
Expand All @@ -687,7 +680,7 @@ export class BravoClient extends FavroClient {
body: options,
},
BravoTagDefinition,
)) as BravoResponseEntities<FavroApi.Tag.Data, BravoTagDefinition>;
)) as BravoResponseEntities<FavroApi.Tag.Model, BravoTagDefinition>;
return await res.getFirstEntity();
}

Expand Down Expand Up @@ -731,7 +724,7 @@ export class BravoClient extends FavroClient {
{ method: 'get' },
BravoCustomFieldDefinition,
)) as BravoResponseEntities<
DataFavroCustomFieldDefinition,
FavroApi.CustomFieldDefinition.Model,
BravoCustomFieldDefinition<any>
>;
this.cache.customFields = res;
Expand Down
7 changes: 3 additions & 4 deletions src/lib/clientLib/BravoResponse.ts
Original file line number Diff line number Diff line change
@@ -1,24 +1,23 @@
import type { BravoClient } from '$lib/BravoClient';
import type { BravoEntity } from '$lib/BravoEntity';
import type { FavroResponse } from './FavroResponse';
import type { DataFavroCustomFieldDefinition } from '$/types/FavroCustomFieldTypes.js';
import type { BravoWidget } from '$entities/BravoWidget.js';
import type { BravoCustomFieldDefinition } from '../entities/BravoCustomField.js';
import type { FavroApi } from '$favro';
import type { BravoTagDefinition } from '../entities/BravoTag.js';

export type BravoResponseWidgets = BravoResponseEntities<
FavroApi.Widget.Data,
FavroApi.Widget.Model,
BravoWidget
>;

export type BravoResponseCustomFields = BravoResponseEntities<
DataFavroCustomFieldDefinition,
FavroApi.CustomFieldDefinition.Model,
BravoCustomFieldDefinition<any>
>;

export type BravoResponseTags = BravoResponseEntities<
FavroApi.Tag.Data,
FavroApi.Tag.Model,
BravoTagDefinition
>;

Expand Down
14 changes: 5 additions & 9 deletions src/lib/entities/BravoCard.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,4 @@
import type {
DataFavroCard,
DataFavroCustomFieldType,
} from '$/types/FavroCardTypes.js';
import type { FavroApiParamsCardUpdate } from '$/types/FavroCardUpdateTypes.js';
import type { FavroApi } from '$/index.js';
import type { ExtractKeysByValue } from '$/types/Utility.js';
import { BravoEntity } from '$lib/BravoEntity.js';
import { assertBravoClaim } from '../errors.js';
Expand All @@ -21,7 +17,7 @@ import {
* A Card "Instance" represents the combination of a Card's
* *global* data and its data associated with a specific Widget.
*/
export class BravoCardInstance extends BravoEntity<DataFavroCard> {
export class BravoCardInstance extends BravoEntity<FavroApi.Card.Model> {
get name() {
return this._data.name;
}
Expand Down Expand Up @@ -377,7 +373,7 @@ export class BravoCardInstance extends BravoEntity<DataFavroCard> {
* only way to guarantee the desired field, since all Custom
* Fields are global in the Favro API.*
*/
async getCustomField<FieldType extends DataFavroCustomFieldType = any>(
async getCustomField<FieldType extends FavroApi.CustomFieldType = any>(
customFieldOrId: CustomFieldOrId<FieldType>,
) {
const setFields = await this.getCustomFields();
Expand Down Expand Up @@ -419,7 +415,7 @@ export class BravoCardInstance extends BravoEntity<DataFavroCard> {
* an error will be thrown.
*
*/
async getCustomFieldByName<FieldType extends DataFavroCustomFieldType = any>(
async getCustomFieldByName<FieldType extends FavroApi.CustomFieldType = any>(
name: string | RegExp,
type: FieldType,
) {
Expand Down Expand Up @@ -513,7 +509,7 @@ export class BravoCardInstance extends BravoEntity<DataFavroCard> {
* If no argument is provided, uses
* any changes made via this instance's `.updateBuilder` methods.
*/
async update(data: FavroApiParamsCardUpdate | BravoCardUpdateBuilder) {
async update(data: FavroApi.Card.UpdateBody | BravoCardUpdateBuilder) {
if (data instanceof BravoCardUpdateBuilder) {
data = data.toJSON();
}
Expand Down
47 changes: 21 additions & 26 deletions src/lib/entities/BravoCardUpdateBuilder.ts
Original file line number Diff line number Diff line change
@@ -1,16 +1,5 @@
import type {
DataFavroCardFavroAttachment,
DataFavroCustomFieldType,
DataFavroRating,
} from '$/types/FavroCardTypes.js';
import type {
FavroApiParamsCardCustomField,
FavroApiParamsCardUpdate,
FavroApiParamsCardUpdateArrayField,
FavroApiParamsCardUpdateCustomField,
} from '$/types/FavroCardUpdateTypes.js';
import type { DataFavroCustomFieldDefinition } from '$/types/FavroCustomFieldTypes.js';
import type { RequiredBy } from '$/types/Utility.js';
import type { FavroApi } from '$/index.js';
import type { ExtractKeysByValue, RequiredBy } from '$/types/Utility.js';
import { assertBravoClaim } from '../errors.js';
import {
addToUniqueArrayBy,
Expand All @@ -29,12 +18,16 @@ import type {
import type { BravoTagDefinition } from './BravoTag.js';
import type { BravoUser } from './BravoUser.js';

export type CustomFieldOrId<FieldType extends DataFavroCustomFieldType = any> =
export type CustomFieldOrId<FieldType extends FavroApi.CustomFieldType = any> =
| string
| DataFavroCustomFieldDefinition
| FavroApi.CustomFieldDefinition.Model<FieldType>
| BravoCustomFieldDefinition<FieldType>
| BravoCustomField<FieldType>;

export type BravoCardFieldWithArrayValue = ExtractKeysByValue<
Required<FavroApi.Card.UpdateBody>,
any[]
>;
/**
* A Card update can be pretty complex, and to save API
* calls its best to do all desired updates in one go
Expand All @@ -43,7 +36,7 @@ export type CustomFieldOrId<FieldType extends DataFavroCustomFieldType = any> =
* approach.
*/
export class BravoCardUpdateBuilder {
private update: RequiredBy<FavroApiParamsCardUpdate, 'customFields'> = {
private update: RequiredBy<FavroApi.Card.UpdateBody, 'customFields'> = {
customFields: [],
};
constructor() {}
Expand Down Expand Up @@ -128,7 +121,9 @@ export class BravoCardUpdateBuilder {
return this.addToUniqueArray('removeAttachments', fileUrls);
}

addFavroAttachments(favroItems: DataFavroCardFavroAttachment[]) {
addFavroAttachments(
favroItems: FavroApi.Card.ModelFieldValue.FavroAttachment[],
) {
this.update.addFavroAttachments ||= [];
ensureArrayExistsAndAddUniqueBy(
this.update.addFavroAttachments,
Expand All @@ -155,7 +150,7 @@ export class BravoCardUpdateBuilder {
addToWidget(
widgetCommonId: string,
options?: Pick<
FavroApiParamsCardUpdate,
FavroApi.Card.UpdateBody,
| 'columnId'
| 'laneId'
| 'dragMode'
Expand All @@ -174,7 +169,7 @@ export class BravoCardUpdateBuilder {

private setCustomFieldUniquely(
customFieldOrId: CustomFieldOrId,
update: FavroApiParamsCardCustomField,
update: FavroApi.CustomFieldValue.UpdateBody,
) {
const customFieldId =
typeof customFieldOrId == 'string'
Expand Down Expand Up @@ -211,7 +206,7 @@ export class BravoCardUpdateBuilder {
customFieldId: CustomFieldOrId<'Single select'>,
statusName: string | RegExp,
fieldDefinition:
| DataFavroCustomFieldDefinition
| FavroApi.CustomFieldDefinition.Model<'Single select'>
| BravoCustomFieldDefinition<'Single select'>
| BravoCustomField<'Single select'>,
) {
Expand Down Expand Up @@ -270,7 +265,7 @@ export class BravoCardUpdateBuilder {

setCustomRating(
customFieldId: CustomFieldOrId<'Rating'>,
rating: DataFavroRating,
rating: FavroApi.CustomFieldValue.ModelFieldValue.Rating,
) {
return this.setCustomFieldUniquely(customFieldId, { total: rating });
}
Expand All @@ -290,7 +285,7 @@ export class BravoCardUpdateBuilder {
customFieldOrId: CustomFieldOrId<'Multiple select'>,
optionNames: (string | RegExp)[],
fieldDefinition:
| DataFavroCustomFieldDefinition
| FavroApi.CustomFieldDefinition.Model<'Multiple select'>
| BravoCustomFieldDefinition<'Multiple select'>
| BravoCustomField<'Multiple select'>,
) {
Expand Down Expand Up @@ -321,7 +316,7 @@ export class BravoCardUpdateBuilder {
: customFieldOrId.customFieldId;
let update = this.update.customFields.find(
(f) => f.customFieldId == customFieldId,
) as FavroApiParamsCardUpdateCustomField<'Members'> | undefined;
) as FavroApi.CustomFieldValue.UpdateBody<'Members'> | undefined;
if (!update) {
update = {
customFieldId,
Expand Down Expand Up @@ -414,10 +409,10 @@ export class BravoCardUpdateBuilder {
* appear in another array, e.g. to prevent an "add" and "remove"
* version of the same action from both containing the same value.
*/
private addToUniqueArray<Field extends FavroApiParamsCardUpdateArrayField>(
private addToUniqueArray<Field extends BravoCardFieldWithArrayValue>(
updateField: Field,
values: FavroApiParamsCardUpdate[Field],
opposingField?: FavroApiParamsCardUpdateArrayField,
values: FavroApi.Card.UpdateBody[Field],
opposingField?: BravoCardFieldWithArrayValue,
) {
this.update[updateField] ||= [];
ensureArrayExistsAndAddUnique(this.update[updateField], values);
Expand Down
2 changes: 1 addition & 1 deletion src/lib/entities/BravoCollection.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { BravoEntity } from '../BravoEntity.js';
import type { BravoWidget } from './BravoWidget.js';
import type { FavroApi } from '$favro';

export class BravoCollection extends BravoEntity<FavroApi.Collection.Data> {
export class BravoCollection extends BravoEntity<FavroApi.Collection.Model> {
get name() {
return this._data.name;
}
Expand Down
Loading

0 comments on commit 076f992

Please sign in to comment.