DEV Community

Cover image for 82-Nodejs Course 2023: Resources: Resource Collection
Hasan Zohdy
Hasan Zohdy

Posted on

82-Nodejs Course 2023: Resources: Resource Collection

Let's go with a new feature here, Getting collection (array) of resources from single resource.

Use Case

We're going to list users, so we want to get users models then loop over these models and inject each model to UserResource then return the array of resources.

We have here two cases, firstly, we need to parse the given resource, wether it's a plain object, model or a resource, thus we can collect data properly from it.

Secondly, to get the collection of resources.

Parsing Resource

We already receives the resource in the constructor, but for now we're just treating it as if its a plain object or just an object and we're trying to access a value from it.

Now let's add two new cases, if the resource is a model, then we'll get the data from it, and if its a resource, then we'll get the resource from it.

// src/core/resources/resource.ts
// ...

import { Model } from "core/database";

// ...


export default class Resource {
  // ...
  /**
   * Constructor
   */
  public constructor(protected resource: any = {}) {
    //
    if (this.resource instanceof Model) {
      this.resource = this.resource.data;
    } else if (this.resource instanceof Resource) {
      this.resource = this.resource.resource;
    }
  }
  // ...
}
Enter fullscreen mode Exit fullscreen mode

In the constructor, we'll check if the resource is a model, then we'll get the data from it, and if its a resource, then we'll get the resource from it.

Now let's add a new static method, we'll call it collect this method will receive bunch of data regardless of its type, and it will return an array of resources.

// src/core/resources/resource.ts


import { Model } from "core/database";

// ...


export default class Resource {
  // ...
  /**
   * Constructor
   */
  public constructor(protected resource: any = {}) {
    //
    if (this.resource instanceof Model) {
      this.resource = this.resource.data;
    } else if (this.resource instanceof Resource) {
      this.resource = this.resource.resource;
    }
  }

  /**
   * return list of resources for the given array ouf data
   */
  public static collect(data: any[]) {
    return data.map(item => {
      return new this(item);
    });
  }
  // ...
}
Enter fullscreen mode Exit fullscreen mode

Now we can use it like this:

// src/app/users/controllers/users-list.ts
import User from "../models/user";
import UserResource from "../resources/user-resource";

export default async function usersList() {
  const users = await User.list();

  return {
    users: UserResource.collect(users),
  };
}
Enter fullscreen mode Exit fullscreen mode

Now the collect method will loop over all users and return a new instance of UserResource for each user.

The question here, why it is a static method? well because we don't have yet an instance, we need to make an instance for each collection item therefore it doesn't make sense to make it anything else but a static method.

🎨 Conclusion

We added two simple features here, first one is to parse the resource, wether it's a plain object, model or a resource, thus we can collect data properly from it.

Secondly, to get the collection of resources using our static method collect.

We did two things here in this article, we created a new method transformValue which will transform a single value, and we also updated our toJSON method to use this new method, and also to check if the value is an array, if it is then we'll loop over it and apply the transformation on each item.

☕♨️ Buy me a Coffee ♨️☕

If you enjoy my articles and see it useful to you, you may buy me a coffee, it will help me to keep going and keep creating more content.

🚀 Project Repository

You can find the latest updates of this project on Github

😍 Join our community

Join our community on Discord to get help and support (Node Js 2023 Channel).

🎞️ Video Course (Arabic Voice)

If you want to learn this course in video format, you can find it on Youtube, the course is in Arabic language.

📚 Bonus Content 📚

You may have a look at these articles, it will definitely boost your knowledge and productivity.

General Topics

Packages & Libraries

React Js Packages

Courses (Articles)

Top comments (0)