a database thing
  • JavaScript 100%
Find a file
2022-02-08 10:59:59 -08:00
.github/workflows feature: add github actions for testing and publishing 2020-12-28 20:00:22 -08:00
databases fix: try to avoid getting stuck in initializing if postgres connection fails 2022-02-08 10:59:59 -08:00
datatypes feature: add new 'date' type 2021-01-21 18:52:08 -08:00
tests fix: handle null values potentially causing off-by-one issues with substitutions 2021-10-18 19:48:25 -07:00
.eslintrc.json fix: better handling of bigint situations 2020-11-04 23:54:19 -08:00
.gitignore initial commit 2019-09-23 20:41:06 -07:00
as_json_schema.js fix: return copies, not the actual entry in the cache for as_json_schema 2021-09-30 06:16:39 -07:00
index.js feature: add model name as json schema description 2020-10-23 18:32:05 -07:00
model.js refactor: 'null' option => 'nullable' 2020-10-20 21:52:09 -07:00
package-lock.json fix: try to avoid getting stuck in initializing if postgres connection fails 2022-02-08 10:59:59 -08:00
package.json fix: try to avoid getting stuck in initializing if postgres connection fails 2022-02-08 10:59:59 -08:00
README.md feature: add handling for not clause 2021-09-28 00:07:34 -07:00

databaser

Example

'use strict';

const {
	as_json_schema,
	databases,
	datatypes,
	model
} = require( 'databaser' );

const User = model( {
	name: 'user',
	schema: {
		id: datatypes.UUID( {
			nullable: false,
			unique: true,
			primary: true
		} ),
		email: datatypes.email( {
			initial: null,
			index: true // add a basic index for this column
		} ),
		name: {
			first: datatypes.string( {
				initial: null
			} ),
			last: datatypes.string( {
				initial: null
			} )
		},
		meta: datatypes.JSON(),
		timestamps: {
			created: datatypes.ISODate(),
			updated: datatypes.ISODate(),
			deleted: datatypes.ISODate( {
				initial: null
			} )
		},
		unstored: datatypes.string( {
			nullable: true,
			initial: null,
			example: 'hello',
			stored: false
		} ),
		not_in_json_schema: datatypes.string( {
			nullable: true,
			initial: null,
			example: 'not here',
			json_schema: false
		} )
	}
} );

( async () => {
	const user = User.create( {
		email: 'foo@bar.com',
		name: {
			first: 'Foo',
			last: 'Bar'
		}
	} );

	console.dir( user );

	const validation_errors = User.validate( user );
	if ( validation_errors.length ) {
		throw new Error( `Invalid user:
		${ JSON.stringify( validation_errors, null, 4 ) ) }
		` );
	}

	// for the example's sake, we could store the 'meta' field as another type
	// with column_type_overrides/serializers/deserializers, eg:
	const users_db = await databases.postgres.get( User, {
		column_type_overrides: {
			meta: 'TEXT'
		},
		serializers: {
			meta: JSON.stringify.bind( JSON )
		},
		deserializers: {
			meta: JSON.parse.bind( JSON )
		}
	} );
	await users_db.put( user );

	const fetched_user = await users_db.get( user.id );
	console.log( `Fetched same user: ${ fetched_user && fetched_user.id === user.id }` );

	const found_user = await users_db.find( {
		email: 'foo@bar.com'
	} );
	console.log( `Found same user: ${ found_user && found_user.id === user.id }` );

	const newest_user = await users_db.find( {}, {
		order: {
			column: [ 'timestamps', 'created' ],
			sort: 'desc'
		}
	} );
	console.log( `Found newest user: ${ newest_user.id }` );

	const first_email_user = await users_db.find( {}, {
		order: {
			column: 'email',
			sort: 'asc'
		}
	} );
	console.log( `Found user with first lexical email: ${ first_email_user.id }` );

	const users_named_john = await users_db.all( {
		name: {
			first: 'John'
		}
	}, {
		limit: 100
	} );
	console.log( `Found ${ users_named_john.length } users named John.` );

	await users_db.del( user.id );
	console.log( 'Deleted user from db.' );

	// we can convert to a json schema, as well
	console.dir( as_json_schema( User ) );
} )();