How to serialize related fields as camelCase in Adonis.JS V5
source link: https://www.mikealche.com/uncategorized/how-to-serialize-related-fields-as-camelcase-in-adonis-js-v5?amp%3Butm_medium=rss&%3Butm_campaign=how-to-serialize-related-fields-as-camelcase-in-adonis-js-v5
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
How to serialize related fields as camelCase in Adonis.JS V5
Hey there!
This will be a short post about a small thing that I encountered while using Adonis.js V5
The thing is that the default naming strategy serializes everything but related models as camelCase.
To have EVERYTHING serialized as camelCase do the following:
1. Create the ‘CamelCaseNamingStrategy.ts’ file
/*
* @adonisjs/lucid
*
* (c) Harminder Virk <[email protected]>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
import { string } from '@poppinss/utils/build/helpers'
import { NamingStrategyContract, LucidModel, ModelRelations } from '@ioc:Adonis/Lucid/Orm'
/**
* Uses snake case as the naming strategy for different model properties
*/
export class CamelCaseNamingStrategy implements NamingStrategyContract {
/**
* The default table name for the given model
*/
public tableName(model: LucidModel): string {
return string.pluralize(string.snakeCase(model.name))
}
/**
* The database column name for a given model attribute
*/
public columnName(_: LucidModel, attributeName: string): string {
return string.snakeCase(attributeName)
}
/**
* The post serialization name for a given model attribute
*/
public serializedName(_: LucidModel, attributeName: string): string {
return string.camelCase(attributeName)
}
/**
* The local key for a given model relationship
*/
public relationLocalKey(
relation: ModelRelations['__opaque_type'],
model: LucidModel,
relatedModel: LucidModel
): string {
if (relation === 'belongsTo') {
return relatedModel.primaryKey
}
return model.primaryKey
}
/**
* The foreign key for a given model relationship
*/
public relationForeignKey(
relation: ModelRelations['__opaque_type'],
model: LucidModel,
relatedModel: LucidModel
): string {
if (relation === 'belongsTo') {
return string.camelCase(`${relatedModel.name}_${relatedModel.primaryKey}`)
}
return string.camelCase(`${model.name}_${model.primaryKey}`)
}
/**
* Pivot table name for many to many relationship
*/
public relationPivotTable(_: 'manyToMany', model: LucidModel, relatedModel: LucidModel): string {
return string.snakeCase([relatedModel.name, model.name].sort().join('_'))
}
/**
* Pivot foreign key for many to many relationship
*/
public relationPivotForeignKey(_: 'manyToMany', model: LucidModel): string {
return string.snakeCase(`${model.name}_${model.primaryKey}`)
}
/**
* Keys for the pagination meta
*/
public paginationMetaKeys(): {
total: string
perPage: string
currentPage: string
lastPage: string
firstPage: string
firstPageUrl: string
lastPageUrl: string
nextPageUrl: string
previousPageUrl: string
} {
return {
total: 'total',
perPage: 'per_page',
currentPage: 'current_page',
lastPage: 'last_page',
firstPage: 'first_page',
firstPageUrl: 'first_page_url',
lastPageUrl: 'last_page_url',
nextPageUrl: 'next_page_url',
previousPageUrl: 'previous_page_url',
}
}
}
Then, once you’ve done that, register that class for all your models in the BaseModel.
2. Change the ‘boot’ method in ‘AppProvider.ts’ to the following:
public async boot() {
// IoC container is ready
const { BaseModel } = await import('@ioc:Adonis/Lucid/Orm')
BaseModel.namingStrategy = new CamelCaseNamingStrategy()
}
That’s it!
Have an amazing day!
Post navigation
Leave a Comment Cancel Reply
Your email address will not be published. Required fields are marked *
Name*
Email*
Website
Save my name, email, and website in this browser for the next time I comment.
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK