Releases: robsontenorio/vue-api-query
Apply instances of relationships to nested objects.
Thanks @JoaoPedroAS51 !
You can also apply a model instance to a nested object by setting the key and the model in relations
method.
If the backend responds with:
// response from API for /posts/1
{
title: 'My title'
body: 'Some text here',
user: {
firstName: 'John',
lastName: 'Doe'
}
}
We just need to set user
to User model:
/models/Post.js
class Post extends Model {
relations () {
return {
// Apply User model to `user` object
user: User
}
}
}
It also works for collections. So if the backend responds with:
// response from API for /comments
{
text: 'Some text here',
user: {
firstName: 'John',
lastName: 'Doe'
},
replies: [
{
text: 'A reply here',
user: {
firstName: 'Joe',
lastName: 'Doe'
}
},
{
text: 'Another reply here',
user: {
firstName: 'Mary',
lastName: 'Doe'
},
replies: [
{
text: 'Yes, this is the reply of the reply!',
user: {
firstName: 'Max',
lastName: 'Doe'
}
}
]
}
]
}
Then we just need to set user
to User model and replies
to Comment model:
/models/Comment.js
class Comment extends Model {
relations () {
return {
// Apply User model to `user` object
user: User,
// Apply Comment model to each object of `replies` array
replies: Comment
}
}
}
Fixes
- Update all dependencies
- Small fix on README @manniL
- Reset query string @MichMich
save()
method makes aPUT
request to the correct URL on nested object thas was fetched withfind()
method @taai
Thanks to @Peter-Krebs for reviewing.
Fix for $find to use a constructor on the result
Add 'fetch' based methods: $first() and $find()
Fix custom resources baseURL()
The `custom()` method takes multiples parameters
Thanks @Peter-Krebs
The custom()
method can be called with multiple arguments to build
resource endpoints and hierarchies. Simply supply them in the correct order.
Any combination of strings and models is possible.
let user = new User({ id: 1 })
let post = new Post()
// GET /users/1/posts/latest
const result = await Post.custom(user, post, 'latest').get()
Improvements and fixes
Update dependencies
Updated to latest babel and eslint features.
Added ability to customize query parameter names
If you need to change default values just override parametersName() on your Base Model. So, the generated query string will use this new values.
import { Model as BaseModel } from 'vue-api-query'
export default class Model extends BaseModel {
parameterNames () {
return {
include: 'include_custom',
filter: 'filter_custom',
sort: 'sort_custom',
fields: 'fields_custom',
append: 'append_custom',
page: 'page_custom',
limit: 'limit_custom'
}
}
}
Fix array strategy validation for SSR
Got error on using vue-api-query with NUXT on universal mode (SSR)
Thanks @MisterEffix
#43
The `for()` method can take multiple objects to build hierarchy levels.
let user = new User({id: 1})
let post = await user.posts().first()
// Related objects go in order of their appearance in the URL.
let comment = new Comment({text: 'for() takes multiple objects.'}).for(user, post)
// POST /users/1/posts/1/comments
await comment.save()
.for() should use object.getPrimaryKey()
Merge pull request #29 from Peter-Krebs/master Model: .for() should use object.getPrimaryKey() instead of object.id
find() method for nested resources
If you need to get a nested resource, without getting the parent model at first, you can do something like this.
// GET /users/1/posts
let User = new User({id: 1})
let Post = await User.posts().get()
// GET /users/1/posts/2
let User = new User({id: 1})
let Post = await User.posts().find(2)