Skip to content

Commit

Permalink
feat(): pr feedback
Browse files Browse the repository at this point in the history
  • Loading branch information
rweber-esri committed Oct 19, 2023
1 parent 5c074c4 commit 7690ff1
Show file tree
Hide file tree
Showing 10 changed files with 144 additions and 90 deletions.
48 changes: 18 additions & 30 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

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

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

/**
* Entity settings
*/
export interface IWithEntitySettings {
entitySettings: Omit<IEntitySetting, "id"> & {
id?: string;
};
entitySettingsId?: string;
}
1 change: 0 additions & 1 deletion packages/common/src/core/traits/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,5 +6,4 @@ export * from "./IWithPermissions";
export * from "./IWithCatalog";
export * from "./IWithViewSettings";
export * from "./IWithDiscussions";
export * from "./IWithEntitySettings";
export * from "./IWithDiscussionsSettings";
11 changes: 7 additions & 4 deletions packages/common/src/discussions/HubDiscussion.ts
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,10 @@ export class HubDiscussion
context: IArcGISContext
): Promise<HubDiscussion> {
try {
const entity = await fetchDiscussion(identifier, context.requestOptions);
const entity = await fetchDiscussion(
identifier,
context.hubRequestOptions
);
// create an instance of HubDiscussion from the entity
return HubDiscussion.fromJson(entity, context);
} catch (ex) {
Expand Down Expand Up @@ -123,14 +126,14 @@ export class HubDiscussion
// update it
this.entity = await updateDiscussion(
this.entity,
this.context.userRequestOptions
this.context.hubRequestOptions
);
} else {
const { createDiscussion } = await import("./edit");
// create it
this.entity = await createDiscussion(
this.entity,
this.context.userRequestOptions
this.context.hubRequestOptions
);
}

Expand All @@ -152,7 +155,7 @@ export class HubDiscussion
const { deleteDiscussion } = await import("./edit");
this.isDestroyed = true;
// Delegate to module fn
await deleteDiscussion(this.entity.id, this.context.userRequestOptions);
await deleteDiscussion(this.entity.id, this.context.hubRequestOptions);
}

/*
Expand Down
8 changes: 6 additions & 2 deletions packages/common/src/discussions/_internal/getPropertyMap.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,12 @@ export function getPropertyMap(): IPropertyMap[] {
storeKey: "item.properties.location",
});
map.push({
entityKey: "entitySettings.settings.discussions",
storeKey: "discussionSettings",
entityKey: "discussionSettings",
storeKey: "entitySettings.settings.discussions",
});
map.push({
entityKey: "entitySettingsId",
storeKey: "entitySettings.id",
});
return map;
}
71 changes: 44 additions & 27 deletions packages/common/src/discussions/edit.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
import { IUserRequestOptions } from "@esri/arcgis-rest-auth";
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 {
EntitySettingType,
IHubRequestOptions,
IModel,
cloneObject,
createSetting,
Expand All @@ -17,6 +16,7 @@ import { getPropertyMap } from "./_internal/getPropertyMap";
import { computeProps } from "./_internal/computeProps";
import { DEFAULT_DISCUSSION, DEFAULT_DISCUSSION_MODEL } from "./defaults";
import { getDefaultEntitySettings } from "../utils/internal/getDefaultEntitySettings";
import { IUserRequestOptions } from "@esri/arcgis-rest-auth";

/**
* @private
Expand All @@ -30,7 +30,7 @@ import { getDefaultEntitySettings } from "../utils/internal/getDefaultEntitySett
*/
export async function createDiscussion(
partialDiscussion: Partial<IHubDiscussion>,
requestOptions: IUserRequestOptions
requestOptions: IHubRequestOptions
): Promise<IHubDiscussion> {
// merge incoming with the default
// this expansion solves the typing somehow
Expand All @@ -54,16 +54,6 @@ 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 All @@ -74,7 +64,20 @@ export async function createDiscussion(
cloneObject(DEFAULT_DISCUSSION_MODEL)
);
// create the item
model = await createModel(model, requestOptions);
model = await createModel(model, requestOptions as IUserRequestOptions);
const defaultSettings = getDefaultEntitySettings("discussion");
// create the entity settings
model.entitySettings = await createSetting({
data: {
id: model.item.id,
type: defaultSettings.type,
settings: {
...defaultSettings.settings,
...discussion.discussionSettings,
},
},
...requestOptions,
});
// map the model back into a IHubDiscussion
let newDiscussion = mapper.storeToEntity(model, {});
newDiscussion = computeProps(model, newDiscussion, requestOptions);
Expand All @@ -91,7 +94,7 @@ export async function createDiscussion(
*/
export async function updateDiscussion(
discussion: IHubDiscussion,
requestOptions: IUserRequestOptions
requestOptions: IHubRequestOptions
): Promise<IHubDiscussion> {
// verify that the slug is unique, excluding the current discussion
discussion.slug = await getUniqueSlug(
Expand All @@ -113,29 +116,41 @@ export async function updateDiscussion(
// but this is where we would apply that sort of logic
const modelToUpdate = mapper.entityToStore(discussion, model);
// update the backing item
const updatedModel = await updateModel(modelToUpdate, requestOptions);
const updatedModel = await updateModel(
modelToUpdate,
requestOptions as IUserRequestOptions
);
// now map back into a discussion and return that
let updatedDiscussion = mapper.storeToEntity(updatedModel, discussion);
updatedDiscussion = computeProps(model, updatedDiscussion, requestOptions);
if (updatedDiscussion.discussionSettings) {
if (updatedDiscussion.entitySettingsId) {
updateSetting({
id: updatedDiscussion.id,
id: updatedDiscussion.entitySettingsId,
data: {
settings: {
discussions: updatedDiscussion.discussionSettings,
},
},
...requestOptions,
});
} else {
updatedDiscussion.discussionSettings = await createSetting({
const defaultSettings = getDefaultEntitySettings("discussion");
const entitySettings = await createSetting({
data: {
id: updatedDiscussion.id,
type: EntitySettingType.CONTENT,
settings: getDefaultEntitySettings(EntitySettingType.CONTENT),
type: defaultSettings.type,
settings: {
...defaultSettings.settings,
discussions: {
...defaultSettings.settings.discussions,
...updatedDiscussion.discussionSettings,
},
},
},
}).then((result) => {
return result.settings.discussions;
...requestOptions,
});
updatedDiscussion.entitySettingsId = entitySettings.id;
updatedDiscussion.discussionSettings = entitySettings.settings.discussions;
}
// the casting is needed because modelToObject returns a `Partial<T>`
// where as this function returns a `T`
Expand All @@ -151,12 +166,14 @@ export async function updateDiscussion(
*/
export async function deleteDiscussion(
id: string,
requestOptions: IUserRequestOptions
requestOptions: IHubRequestOptions
): Promise<void> {
removeSetting({ id }).catch(() => {
// surpressing error...
});
const ro = { ...requestOptions, ...{ id } } as IUserItemOptions;
await removeItem(ro);
try {
removeSetting({ id, ...requestOptions });
} catch (e) {
// suppress error
}
return;
}
Loading

0 comments on commit 7690ff1

Please sign in to comment.