afterChange "Create New Entry" in Collection

default discord avatar
kittabit
3 months ago
1 1

Good Afternoon Everyone,

I might just be missing something in the documentation, but I'm running into an issue; I have let's say 10 different collections, but when something is added to one of these collections, I want to create a new entry into one called "ActivityFeed" as an example.

After some digging around myself, I attempted to use ChatGPT and Bard (even after feeding it Payload documentation - it wasn't great to say the least); ChatGPT tried to suggest something like the following:

  1. Import "ActivityFeed" Collection:
    import ActivityFeed from './ActivityFeed';

  2. Add function that could be used in hook for collection:

const afterChange: CollectionAfterChangeHook = async ({ doc, previousDoc, operation, req }) => {
  if (operation === 'create' || operation === 'update') {
    const activity = {
      timestamp: new Date(),
      type: operation === 'create' ? 'added' : 'updated',
      relatedItem: doc._id, // Use the document's _id as the related item
      user: doc.author, // Use the author from the document as the user
    };

    // Create a slug for the activity feed entry based on the related item's title
    const relatedItemTitle = doc.title || previousDoc.title;
    const slug = createSlug(relatedItemTitle);

    // Save the activity feed entry
    const activityFeedModel = req.models[ActivityFeed.slug];
    const activityFeed = await Payload.findOne(ActivityFeed.slug, {}, activityFeedModel);
    await Payload.create(ActivityFeed.slug, { ...activity, slug }, activityFeedModel, activityFeed);
  }

  return doc;
};

...or this...

const afterChange: CollectionAfterChangeHook = async ({
  doc,
  previousDoc,
  operation,
  req,
  model,
}) => {
  if (operation === 'create' || operation === 'update') {
    const activity = {
      timestamp: new Date(),
      type: operation === 'create' ? 'added' : 'updated',
      relatedItem: doc._id, // Use the document's _id as the related item
      user: doc.author, // Use the author from the document as the user
    };

    // Create a slug for the activity feed entry based on the related item's title
    const relatedItemTitle = doc.title || previousDoc.title;
    const slug = createSlug(relatedItemTitle);

    // Save the activity feed entry
    await Payload.adapters.default.create(
      ActivityFeed.slug,
      { ...activity, slug },
      model
    );
  }

  return doc;
};

I know this is all wrong, and I know I'm overlooking something - so if anyone could give me any guidance or just point me in the right direction, I'd REALLY appreciate it as I'm feeling a bit stuck at the moment. I know I'm just missing something along the lines of payload.create, but everything I try is just erroring out or making TypeScript very angry haha.

Thanks in advance y'all, I really appreciate any help!!!

Cheers,
-Nick

  • discord user avatar
    denolfe
    Payload Team
    3 months ago

    I would definitely recommend going to the docs before using anything like ChatGPT.

    What you're looking for is the Local API's create function. Here's some psuedo-code for you to work from:

    // Inside hook
    await req.payload.create({
      collection: "activity", // Activity collection slug
      data: {
          timestamp: new Date(),
          type: operation === 'create' ? 'added' : 'updated',
          relatedItem: doc.id, // Relation field to current collection 
          user: doc.author,  // Relation field to user collection
        },
    });
Open the post
Continue the discussion in GitHub
Like what we're doing?
Star us on GitHub!

Star

Connect with the Payload Community on Discord

Discord

online

Can't find what you're looking for?

Get help straight from the Payload team with an Enterprise License.