wmz-sequerizer
v1.0.2
Published
This is simplifier sequelize model, and it has similiar method with eloquent methods in laravel
Readme
Sure, here's the modified README.md to include an example blueprint for the posts table and all the required fields.
Sequerizer
Sequerizer is a simple and powerful ORM (Object Relational Mapper) built on top of Sequelize. It provides a clean and easy-to-use interface for interacting with your database models.
Features
- CRUD Operations: Create, Read, Update, and Delete data.
- Query Building: Build complex queries with ease.
- Middleware: Add custom middleware for additional logic.
- Pagination: Easily paginate your results with
limitandoffset. - Error Handling: Comprehensive error handling for all operations.
Installation
Install via npm:
npm install @wildanmzaki/sequerizerUsage
Setup
First, you need to configure your Sequelize instance and define your models. Here's an example setup using a posts table:
Blueprint
Create a blueprint file for your table definition, e.g., blueprints.js:
const { DataTypes } = require("sequelize");
const posts = () => [
"posts",
{
id: {
type: DataTypes.INTEGER,
primaryKey: true,
autoIncrement: true,
},
title: {
type: DataTypes.STRING,
allowNull: false,
},
thumbnail: {
type: DataTypes.STRING,
allowNull: true,
},
content: {
type: DataTypes.TEXT,
allowNull: false,
},
views: {
type: DataTypes.INTEGER,
allowNull: false,
defaultValue: 0,
},
},
{
timestamps: true,
},
];
module.exports = { posts };Model Definition
Define your model using Sequerizer and the blueprint:
const { Sequelize } = require("sequelize");
const { Sequerizer, Op, ModelError } = require("sequerizer");
const { posts } = require("./blueprints.js");
const sequelize = new Sequelize("database", "username", "password", {
host: "localhost",
dialect: "mysql",
});
const table = sequelize.define(...posts());
class PostModel extends Sequerizer {
constructor() {
super(table);
}
async getRecentPosts(limit = 10) {
try {
const recentPosts = await this.orderBy("createdAt", "DESC")
.limit(limit)
.get();
return recentPosts;
} catch (error) {
throw new ModelError("Error fetching recent posts: " + error.message);
}
}
}
const Post = new PostModel();
module.exports = Post;CRUD Operations
Create
To create a new record:
const Post = require("./path_to_PostModel");
async function createPost() {
try {
const newPost = await Post.create({
title: "New Post",
thumbnail: "image.jpg",
content: "This is the content of the post",
views: 0,
});
console.log(newPost);
} catch (error) {
console.error(error.message);
}
}
createPost();Read
To fetch records:
async function getPosts() {
try {
const posts = await Post.where("views", 0).get();
console.log(posts);
} catch (error) {
console.error(error.message);
}
}
getPosts();Update
To update records:
async function updatePost(id) {
try {
const updated = await Post.where("id", id).update({ views: 10 });
console.log(updated);
} catch (error) {
console.error(error.message);
}
}
updatePost(1);Delete
To delete records:
async function deletePost(id) {
try {
const deleted = await Post.where("id", id).delete();
console.log(deleted);
} catch (error) {
console.error(error.message);
}
}
deletePost(1);Pagination
To paginate results:
async function getPaginatedPosts() {
try {
const posts = await Post.limit(10).offset(20).get();
console.log(posts);
} catch (error) {
console.error(error.message);
}
}
getPaginatedPosts();Middleware
To add custom middleware:
async function createVerifiedPost(data) {
try {
const newPost = await (
await post.verify(async (model) => {
const exists = await model.where("title", data.title).exists();
// Return true mean verified, return false would throw Error
return !exists;
})
).create(data);
console.log(newPost);
} catch (error) {
console.error(error.message);
}
}
createVerifiedPost({
title: "Unique Post",
thumbnail: "unique_image.jpg",
content: "This is unique content",
views: 0,
});Methods
async methods
Please note that async method must be called with await or use .then chaining method with callback function inside .then method
// Callback way
Post.get().then(function (posts) {
// do something with posts that returned from get method
});
Post.verify(async (model) => {
// Do something like verifying the data exists or no
const isExists = await model.where({ ...conditions }).exists();
return !isExists;
}).then(async (model) => {
await model.create({
...data,
});
});
// await way
const posts = await Post.get();create (async)
Create a single row of data.
Post.create({
title: "Hot News",
content: "Lorem ipsum ...",
});insert (async)
Insert one or multiple rows of data into the table.
// Single insert:
Post.insert({
title: "Hot News",
content: "Lorem ipsum ...",
});
// Multiple inserts:
Post.insert([
{
title: "Hot News",
content: "Lorem ipsum ...",
},
{
title: "Common News",
content: "Lorem ipsum ...",
},
// ...
]);get (async)
Fetch data from the table in the database.
Post.get(); // Fetch all data
// Variants:
Post.where('column', 'value') // Set condition
.orderBy('id', 'DESC') // Order data
.limit(15) // Limit the data
.offset(10) // Set offset/starting row
.get(['column1', 'column2', ...]); // Specify columns to fetchgetWhere (async)
Fetch specified data based on conditions defined in the parameter.
Post.getWhere({
status: 'published',
views: {
[Op.gt]: 50, // 'gt' is from Sequelize, meaning 'greater than'
},
});
// Specify the columns:
Post.needColumns(['column1', 'column2', ...])
.getWhere({
...conditions
});find (async)
Get data based on the primary key in the table.
Post.find(id);
// Returns null or an object
// Throw an error if the data is not found
Post.withError().find("xxxxx");needColumns
Specify the columns you need.
Post.needColumns(['column1', 'column2', ...])
.get();where
Define the conditions of the rows that you want to fetch, update, or delete.
Post.where("column", "value").get();
Post.where({
column1: "value1",
column2: "value2",
}).get();
Post.where("column1", "value1").where("column2", "value2").get();orderBy
Order fetched data.
Post.orderBy("createdAt", "DESC").get();
Post.orderBy("title", "ASC").get();groupBy
Group result by the column
Post.groupBy("category").get();groupWith
Group result by the columns
Post.groupWith(["category", "tag"]).get();limit
Limit the number of rows fetched from the table.
Post.limit(10).get();offset
Set the starting point for fetching rows from the table (useful for pagination).
Post.limit(10).offset(20).get();verify (async)
Add custom verification logic using a callback function.
Post.verify(async (model) => {
const exists = await model.where("title", "Some Title").exists();
return !exists;
}).create({
title: "Unique Title",
content: "Unique Content ...",
});verifySync
Add custom verification logic using a callback function. But now the process of verification is synchronous
Post.verifySync((model) => {
const exists = true;
return !exists;
}).create({
title: "Unique Title",
content: "Unique Content ...",
});count (async)
Count total of the rows based on the condition
Post.count(); // Count all
const total = await Post.count({ status: "published" });
console.log(total); // Returns total of the rowsexists (async)
Check if any row exists based on specified conditions.
const exists = await Post.where("column", "value").exists();
console.log(exists); // Returns true or falseupdate (async)
Update rows based on specified conditions.
Post.where("status", "draft").update({
status: "published",
});delete (async)
Delete rows based on specified conditions.
Post.where("status", "obsolete").delete();first (async)
Fetch the first row that matches the specified conditions.
Post.where("status", "published").orderBy("createdAt", "ASC").first();getOrCreate (async)
Fetch a row based on specified conditions or create it if it doesn't exist.
Post.getOrCreate({
title: "Breaking News",
content: "This just in ...",
});option
Add custom options to the query.
Post.option("raw", true).get();withError
Enable error throwing for not found conditions.
Post.withError().find("nonexistent-id");Error Handling
Sequerizer includes comprehensive error handling for all operations. You can catch and handle specific errors:
const {
ModelError,
CreateError,
ReadError,
UpdateError,
DeleteError,
} = require("sequerizer");
try {
// Your code here...
} catch (error) {
if (error instanceof CreateError) {
console.error("Create Error: ", error.message);
} else if (error instanceof ReadError) {
console.error("Read Error: ", error.message);
} else if (error instanceof UpdateError) {
console.error("Update Error: ", error.message);
} else if (error instanceof DeleteError) {
console.error("Delete Error: ", error.message);
} else {
console.error("Unknown Error: ", error.message);
}
}License
This project is licensed under the MIT License. See the LICENSE file for more details.
This README includes:
- Blueprint Example: Adds an example blueprint for the
poststable. - Model Definition: Shows how to define the model using the blueprint.
- Usage Examples: Includes examples of how to create, read, update, delete, and paginate posts.
- Middleware: Shows how to add custom middleware.
- Methods: Description for each method
- Error Handling: Describes how to handle different types of errors.
