Skip to content

Commit

Permalink
feat(hub-common): add support for discussion settings for entities
Browse files Browse the repository at this point in the history
affects: @esri/hub-common, @esri/hub-discussions

ISSUES CLOSED: 7412
  • Loading branch information
juliannaeapicella authored and rweber-esri committed Oct 19, 2023
1 parent 102fcee commit 5c074c4
Show file tree
Hide file tree
Showing 11 changed files with 106 additions and 12 deletions.
5 changes: 4 additions & 1 deletion packages/common/src/core/HubItemEntity.ts
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ import { AssociationType, IAssociationInfo } from "../associations/types";
import { listAssociations } from "../associations/listAssociations";
import { addAssociation } from "../associations/addAssociation";
import { removeAssociation } from "../associations/removeAssociation";
import { IEntitySetting, IWithEntitySettings } from "..";

const FEATURED_IMAGE_FILENAME = "featuredImage.png";

Expand All @@ -56,8 +57,10 @@ export abstract class HubItemEntity<T extends IHubItemEntity>
IWithPermissionBehavior,
IWithDiscussionsBehavior,
IWithFollowersBehavior,
IWithAssociationBehavior
IWithAssociationBehavior,
IWithEntitySettings
{
entitySettings: Omit<IEntitySetting, "id"> & { id?: string };
protected context: IArcGISContext;
protected entity: T;
protected isDestroyed: boolean = false;
Expand Down
8 changes: 8 additions & 0 deletions packages/common/src/core/traits/IWithDiscussionsSettings.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import { IDiscussionsSettings } from "../../discussions";

/**
* Discussions-related settings
*/
export interface IWithDiscussionsSettings {
discussionSettings: IDiscussionsSettings;
}
10 changes: 10 additions & 0 deletions packages/common/src/core/traits/IWithEntitySettings.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import { IEntitySetting } from "../../discussions";

/**
* Entity settings
*/
export interface IWithEntitySettings {
entitySettings: Omit<IEntitySetting, "id"> & {
id?: string;
};
}
2 changes: 2 additions & 0 deletions packages/common/src/core/traits/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,3 +6,5 @@ export * from "./IWithPermissions";
export * from "./IWithCatalog";
export * from "./IWithViewSettings";
export * from "./IWithDiscussions";
export * from "./IWithEntitySettings";
export * from "./IWithDiscussionsSettings";
9 changes: 7 additions & 2 deletions packages/common/src/core/types/IHubDiscussion.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,8 @@
import { IWithPermissions, IWithSlug } from "../traits";
import {
IWithDiscussionsSettings,
IWithPermissions,
IWithSlug,
} from "../traits";
import { IHubItemEntity, IHubItemEntityEditor } from "./IHubItemEntity";

/**
Expand All @@ -8,6 +12,7 @@ import { IHubItemEntity, IHubItemEntityEditor } from "./IHubItemEntity";
export interface IHubDiscussion
extends IHubItemEntity,
IWithSlug,
IWithPermissions {}
IWithPermissions,
IWithDiscussionsSettings {}

export type IHubDiscussionEditor = IHubItemEntityEditor<IHubDiscussion> & {};
9 changes: 8 additions & 1 deletion packages/common/src/discussions/_internal/getPropertyMap.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,17 @@ export function getPropertyMap(): IPropertyMap[] {
const map = getBasePropertyMap();

// Type specific mappings
map.push({ entityKey: "prompt", storeKey: "data.prompt" });
map.push({
entityKey: "prompt",
storeKey: "data.prompt",
});
map.push({
entityKey: "location",
storeKey: "item.properties.location",
});
map.push({
entityKey: "entitySettings.settings.discussions",
storeKey: "discussionSettings",
});
return map;
}
10 changes: 5 additions & 5 deletions packages/common/src/discussions/api/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1037,7 +1037,7 @@ export interface IEntitySetting
IWithTimestamps {
id: string;
type: EntitySettingType;
settings: IEntityContentSettings;
settings: IEntitySettings;
}

/**
Expand All @@ -1050,9 +1050,9 @@ export enum EntitySettingType {

/**
* @export
* @interface IEntityContentSettings
* @interface IEntitySettings
*/
export interface IEntityContentSettings {
export interface IEntitySettings {
discussions?: IDiscussionsSettings;
}

Expand Down Expand Up @@ -1081,15 +1081,15 @@ export interface IRemoveSettingResponse {
export interface ICreateSetting {
id: string;
type: EntitySettingType;
settings: IEntityContentSettings;
settings: IEntitySettings;
}

/**
* @export
* @interface IUpdateSetting
*/
export interface IUpdateSetting {
settings: Partial<IEntityContentSettings>;
settings: Partial<IEntitySettings>;
}

/**
Expand Down
44 changes: 43 additions & 1 deletion packages/common/src/discussions/edit.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,20 @@ import { IUserItemOptions, removeItem } from "@esri/arcgis-rest-portal";
import { IHubDiscussion } from "../core/types";
import { createModel, getModel, updateModel } from "../models";
import { constructSlug, getUniqueSlug, setSlugKeyword } from "../items/slugs";
import { IModel, cloneObject, setDiscussableKeyword } from "../index";
import {
EntitySettingType,
IModel,
cloneObject,
createSetting,
removeSetting,
setDiscussableKeyword,
updateSetting,
} from "../index";
import { PropertyMapper } from "../core/_internal/PropertyMapper";
import { getPropertyMap } from "./_internal/getPropertyMap";
import { computeProps } from "./_internal/computeProps";
import { DEFAULT_DISCUSSION, DEFAULT_DISCUSSION_MODEL } from "./defaults";
import { getDefaultEntitySettings } from "../utils/internal/getDefaultEntitySettings";

/**
* @private
Expand Down Expand Up @@ -45,6 +54,16 @@ export async function createDiscussion(
discussion.typeKeywords,
discussion.isDiscussable
);
// initialize discussion settings
discussion.discussionSettings = await createSetting({
data: {
id: discussion.id,
type: EntitySettingType.CONTENT,
settings: getDefaultEntitySettings(EntitySettingType.CONTENT),
},
}).then((result) => {
return result.settings.discussions;
});
// Map discussion object onto a default discussion Model
const mapper = new PropertyMapper<Partial<IHubDiscussion>, IModel>(
getPropertyMap()
Expand Down Expand Up @@ -98,6 +117,26 @@ export async function updateDiscussion(
// now map back into a discussion and return that
let updatedDiscussion = mapper.storeToEntity(updatedModel, discussion);
updatedDiscussion = computeProps(model, updatedDiscussion, requestOptions);
if (updatedDiscussion.discussionSettings) {
updateSetting({
id: updatedDiscussion.id,
data: {
settings: {
discussions: updatedDiscussion.discussionSettings,
},
},
});
} else {
updatedDiscussion.discussionSettings = await createSetting({
data: {
id: updatedDiscussion.id,
type: EntitySettingType.CONTENT,
settings: getDefaultEntitySettings(EntitySettingType.CONTENT),
},
}).then((result) => {
return result.settings.discussions;
});
}
// the casting is needed because modelToObject returns a `Partial<T>`
// where as this function returns a `T`
return updatedDiscussion as IHubDiscussion;
Expand All @@ -114,6 +153,9 @@ export async function deleteDiscussion(
id: string,
requestOptions: IUserRequestOptions
): Promise<void> {
removeSetting({ id }).catch(() => {
// surpressing error...
});
const ro = { ...requestOptions, ...{ id } } as IUserItemOptions;
await removeItem(ro);
return;
Expand Down
7 changes: 6 additions & 1 deletion packages/common/src/discussions/fetch.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,11 @@ import { IItem, getItem } from "@esri/arcgis-rest-portal";
import { IHubDiscussion } from "../core/types";
import { fetchModelFromItem } from "../models";
import { getItemBySlug } from "../items/slugs";
import { IModel, isGuid } from "../index";
import { EntitySettingType, IModel, fetchSetting, isGuid } from "../index";
import { PropertyMapper } from "../core/_internal/PropertyMapper";
import { getPropertyMap } from "./_internal/getPropertyMap";
import { computeProps } from "./_internal/computeProps";
import { getDefaultEntitySettings } from "../utils/internal/getDefaultEntitySettings";

/**
* @private
Expand Down Expand Up @@ -45,6 +46,10 @@ export async function convertItemToDiscussion(
requestOptions: IRequestOptions
): Promise<IHubDiscussion> {
const model = await fetchModelFromItem(item, requestOptions);
await fetchSetting({ id: item.id }).then((settings) => {
model.entitySettings =
settings ?? getDefaultEntitySettings(EntitySettingType.CONTENT);
});
const mapper = new PropertyMapper<Partial<IHubDiscussion>, IModel>(
getPropertyMap()
);
Expand Down
12 changes: 12 additions & 0 deletions packages/common/src/utils/internal/getDefaultEntitySettings.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import { EntitySettingType, IEntitySettings } from "../../discussions";

export function getDefaultEntitySettings(
type: EntitySettingType
): IEntitySettings {
return {
discussions: {
allowedChannelIds: [],
allowedLocations: [],
},
};
}
2 changes: 1 addition & 1 deletion packages/discussions/src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ export {
IRemoveChannelActivityParams,
IEntitySetting,
EntitySettingType,
IEntityContentSettings,
IEntitySettings,
IDiscussionsSettings,
IRemoveSettingResponse,
ICreateSetting,
Expand Down

0 comments on commit 5c074c4

Please sign in to comment.