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;
}
}
// ...
}
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);
});
}
// ...
}
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),
};
}
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
- Event Driven Architecture: A Practical Guide in Javascript
- Best Practices For Case Styles: Camel, Pascal, Snake, and Kebab Case In Node And Javascript
- After 6 years of practicing MongoDB, Here are my thoughts on MongoDB vs MySQL
Packages & Libraries
- Collections: Your ultimate Javascript Arrays Manager
- Supportive Is: an elegant utility to check types of values in JavaScript
- Localization: An agnostic i18n package to manage localization in your project
React Js Packages
Courses (Articles)
Top comments (0)