
Security News
npm Adopts OIDC for Trusted Publishing in CI/CD Workflows
npm now supports Trusted Publishing with OIDC, enabling secure package publishing directly from CI/CD workflows without relying on long-lived tokens.
@ticatec/node-common-library
Advanced tools
A comprehensive Node.js database access framework providing robust abstractions for database connection management, SQL execution, transaction handling, pagination, and dynamic query building.
中文文档 | English
A comprehensive Node.js database access framework providing robust abstractions for database connection management, SQL execution, transaction handling, pagination, and dynamic query building.
DBConnection
implementationsbeginTransaction()
, commit()
, and rollback()
for reliable operationsPaginationList
CommonSearchCriteria
npm install @ticatec/node-common-library
import { DBManager, BeanFactory, CommonService, CommonDAO } from '@ticatec/node-common-library';
import { Scope } from '@ticatec/node-common-library';
// Initialize database manager with your database factory
const dbManager = DBManager.init(yourDBFactory);
// Register DAOs and Services
const beanFactory = BeanFactory.getInstance();
beanFactory.register('UserDAO', UserDAO, Scope.Singleton);
beanFactory.register('UserService', UserService, Scope.Singleton);
import { CommonDAO } from '@ticatec/node-common-library';
import DBConnection from '@ticatec/node-common-library/lib/db/DBConnection';
class UserDAO extends CommonDAO {
async createUser(conn: DBConnection, user: User): Promise<number> {
const sql = 'INSERT INTO users (name, email) VALUES ($1, $2)';
return await conn.insertRecord(sql, [user.name, user.email]);
}
async findUserById(conn: DBConnection, id: number): Promise<User> {
const sql = 'SELECT * FROM users WHERE id = $1';
return await conn.find(sql, [id]);
}
async updateUser(conn: DBConnection, user: User): Promise<number> {
const sql = 'UPDATE users SET name = $1, email = $2 WHERE id = $3';
return await conn.updateRecord(sql, [user.name, user.email, user.id]);
}
}
import { CommonService } from '@ticatec/node-common-library';
import DBConnection from '@ticatec/node-common-library/lib/db/DBConnection';
class UserService extends CommonService {
async createUser(userData: User): Promise<number> {
return this.executeInTx(async (conn: DBConnection) => {
const userDAO = this.getDAOInstance('UserDAO');
return await userDAO.createUser(conn, userData);
});
}
async getUser(id: number): Promise<User> {
return this.executeNonTx(async (conn: DBConnection) => {
const userDAO = this.getDAOInstance('UserDAO');
return await userDAO.findUserById(conn, id);
});
}
}
import { CommonSearchCriteria } from '@ticatec/node-common-library';
import DBConnection from '@ticatec/node-common-library/lib/db/DBConnection';
class UserSearchCriteria extends CommonSearchCriteria {
constructor(criteria?: any) {
super(criteria);
this.sql = 'SELECT id, name, email, created_at FROM users WHERE 1=1';
this.orderBy = 'ORDER BY created_at DESC';
}
protected buildDynamicQuery(): void {
if (this.criteria?.name) {
this.buildStarCriteria(this.criteria.name, 'name');
}
if (this.criteria?.email) {
this.buildCriteria(this.criteria.email, 'email');
}
if (this.criteria?.dateFrom || this.criteria?.dateTo) {
this.buildRangeCriteria(this.criteria.dateFrom, this.criteria.dateTo, 'created_at');
}
}
}
// Usage
const criteria = new UserSearchCriteria({
name: 'John*', // Will use LIKE query
email: 'john@example.com', // Will use exact match
page: 1,
rows: 20
});
const result = await criteria.paginationQuery(conn);
console.log(`Total: ${result.count}, Pages: ${result.pages}`);
console.log('Users:', result.list);
Abstract base class for Data Access Objects, providing utility methods for common database operations:
genID()
: Generates a 32-bit UUIDexecuteCountSQL()
: Executes count queriesquickSearch()
: Performs paginated queries with default row limitsconvertBooleanFields()
: Converts T/F strings to boolean valuesAbstract service layer class for managing database connections and transactions:
executeInTx()
: Runs functions within transactions with automatic commit/rollbackexecuteNonTx()
: Runs functions without transactionsgetDAOInstance()
: Retrieves DAO instances via BeanFactoryAbstract class defining core database operations:
beginTransaction()
, commit()
, rollback()
executeUpdate()
, insertRecord()
, updateRecord()
, deleteRecord()
find()
, listQuery()
, executePaginationSQL()
executeSQLFile()
resultToList()
with camelCase conversionBase class for building dynamic search queries with pagination:
buildDynamicQuery()
: Override to define custom search logicbuildCriteria()
: Builds equality conditionsbuildStarCriteria()
: Builds LIKE conditions with wildcard supportbuildRangeCriteria()
: Builds range conditions (from/to)paginationQuery()
: Executes paginated queriesquery()
: Executes non-paginated queriesSingleton factory for managing DAO and Service instances:
import { BeanFactory, Scope } from '@ticatec/node-common-library';
const factory = BeanFactory.getInstance();
factory.register('UserDAO', UserDAO, Scope.Singleton);
factory.register('TempDAO', TempDAO, Scope.Prototype);
const userDAO = factory.getInstance('UserDAO'); // Same instance
const tempDAO = factory.createBean('TempDAO'); // New instance each time
import { BatchRecord, BatchRecords } from '@ticatec/node-common-library';
const batchRecords: BatchRecords<User> = [
{ recNo: 1, data: { name: 'User1', email: 'user1@test.com' }, error: null },
{ recNo: 2, data: { name: 'User2', email: 'user2@test.com' }, error: null }
];
// Process batch records
for (const record of batchRecords) {
try {
await userDAO.createUser(conn, record.data);
} catch (error) {
record.error = error;
}
}
import BitsBoolean from '@ticatec/node-common-library/lib/BitsBoolean';
class UserPermissions extends BitsBoolean {
constructor(value: number = 0) {
super(value);
}
setCanRead(value: boolean): void {
this.setBitValue(0, value);
}
getCanRead(): boolean {
return this.getBitValue(0);
}
setCanWrite(value: boolean): void {
this.setBitValue(1, value);
}
getCanWrite(): boolean {
return this.getBitValue(1);
}
}
import { StringUtils } from '@ticatec/node-common-library';
const id = StringUtils.genID(); // 32-character UUID without dashes
const uuid = StringUtils.uuid(); // Standard UUID with dashes
const isNum = StringUtils.isNumber('123'); // true
const parsed = StringUtils.parseNumber('abc', 0); // 0 (default value)
The library provides specialized exceptions:
import { OptimisticLockException } from '@ticatec/node-common-library';
try {
await userDAO.updateUser(conn, user);
} catch (error) {
if (error instanceof OptimisticLockException) {
console.log('Concurrent update conflict:', error.entity);
// Handle optimistic lock conflict
}
}
git checkout -b feature/AmazingFeature
)git commit -m 'Add some AmazingFeature'
)git push origin feature/AmazingFeature
)This project is licensed under the MIT License - see the LICENSE file for details.
Henry Feng - huili.f@gmail.com
Note: This library is designed to create a consistent data access layer across various database drivers. Ensure proper configuration of log4js
for logging and implement your specific DBConnection
class for your chosen database system.
FAQs
A comprehensive Node.js database access framework providing robust abstractions for database connection management, SQL execution, transaction handling, pagination, and dynamic query building.
We found that @ticatec/node-common-library demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 0 open source maintainers collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
npm now supports Trusted Publishing with OIDC, enabling secure package publishing directly from CI/CD workflows without relying on long-lived tokens.
Research
/Security News
A RubyGems malware campaign used 60 malicious packages posing as automation tools to steal credentials from social media and marketing tool users.
Security News
The CNA Scorecard ranks CVE issuers by data completeness, revealing major gaps in patch info and software identifiers across thousands of vulnerabilities.