Navigation Menu

Skip to content
This repository has been archived by the owner on Aug 5, 2021. It is now read-only.

Releases: PhilWaldmann/openrecord

new helper methods

14 Dec 19:11
Compare
Choose a tag to compare
  • added record.update(data)
  • added record.isNewRecord

Custom relations

11 Oct 15:28
Compare
Choose a tag to compare

It's now possible to create custom relations
e.g.

// models/User.js
this.has('has_posts_written', {
  query: function(store, parentRecords){
    const ids = parentRecords.map(r => r.id)
    const Post = store.Model('Post')
    // query all posts by user_id, group by user_id and count(distinct(id))
    return Post.totalCount().group('user_id').where({user_id: ids})
  },

  convert: function(parent, records){
    if(!records) return false
    // records => [{user_id: 1, count: 4}, {user_id: 2, count: 1}]
    // == the result of the above query!
    const result = records.find(r => r.user_id === parent.id)
    if(!result) return false
    return result.count > 0
  }
})

A custom relation could return anything. In the example above it'll return a boolean value.

Works with include() like any other relation:
User.include('has_posts_written')

added additional migration functions/options

03 Oct 14:24
Compare
Choose a tag to compare
v2.4

add more migration functions/options #76

sqlite3 `store.close()` and dependency update

03 Oct 13:35
Compare
Choose a tag to compare
v2.3

add more migration functions/options #76

additional postgres types + attribute name converter

29 Aug 18:07
Compare
Choose a tag to compare

The postgres store now supports all geometric data types.

There are also two new store options externalAttributeName and internalAttributeName for all stores.
Both options are optional and expect a method in the form of function(fieldName: string): string

With externalAttributeName you can convert your internal database field names into another format. e.g. from snake_case to camelCase. The conversion is up to you!
internalAttributeName should handle the opposite way.

Typescript support

21 Aug 13:46
Compare
Choose a tag to compare
v2.1.0

Merge branch 'master' of https://github.com/PhilWaldmann/openrecord

Version 2.0

18 Apr 11:28
Compare
Choose a tag to compare

Version 2.0 - whats new?

Bulk loading

Relations got rewritten with optional bulk loading:

const user = await User.limit(3)
const posts = await Promise.all(users.map(user => user.posts))

will only execute 2 queries! To disable bulk loading see bulkFetch.
However, in this case it's better to use const user = await User.include('posts').limit(3)

Faster preloading

include was rewritten to load relations in parallel, if possible (SQL only!)

const users = await User.find(1).include('posts')
/*
  will execute `SELECT * FROM users WHERE id=1`
  and `SELECT * FROM posts WHERE user_id = 1` in parallel
*/

In V1 the above example would have loaded the data in series.

Of course this is only possible if the conditions for the first query will contain all information needed to execute the second query!

Model autoload (SQL only)

Similar to autoloading model attributes, it's now possible to autoload models.

const Store = require('openrecord/store/sqlite3')

const store = new Store({
  file: './my-posts-db.sqlite3',
  autoLoad: true // enable autoload
})

store.ready(async () => {
  const post = await store.Model('Post').find(1) // Post model is automatically available, if a table `posts` is defined in the sqlite3 database before.
  console.log(post)
})

Classes

Defining a model via ES6 classes is now possible

class User extends Store.BaseModel{
  fullName(){
    return `${this.first_name} ${this.last_name}`
  }
}

GraphQL

Support for GraphQL with automatic relation loading and more.

Webpack

It's now possible to bundle your store via webpack (Version 3 and 4)
There is also a Webpack Plugin to cache your data structure inside your bundle. (Faster startup for serverless apps)

Custom operators

It's now possible to define custom operators and use the whole power of knex

// the new operator is called `regexp`
store.addOperator('regexp', function(field, value, query, condition){
  query.where(field, '~', value.toString().replace(/(^\/|\/$)/g, '')) // naiv conversion of js regexp to postgres regexp!
})
// and it will be appended to the `string` type
store.appendOperator('string', 'regexp')

Query via:

const user = await User.where({login_regexp: /open.*/})

Everything Promise!

The whole core was rewritten to use Promises instead of async.

Docs

Docs are now available via https://openrecord.js.org

Breaking Changes to V1

  • plugins and models store config does not take paths anymore. To get the old behavior back, use the automatic model loading plugin
  • paranoid plugin scope to get all records was renamed to withDeleted instead of with_deleted
  • join() does an inner join by default (instead of a left join)
  • Failed validations will now throw an error! Thereforesave, delete, create,... won't return success anymore. Instead it will return the record on success
  • Hooks must return a promise or undefined. The done callback was removed.
  • create, save, destroy, ... won't take callbacks any more. use e.g. record.save().then(callback)
  • Relation records wont be saved anymore. except you set autoSave to true (store or per relation)
  • Accessing a relation via e.g. user.posts will return a then-able object. To access loaded data directly use user._posts (Will return null if not loaded)
  • limit(1) does not return a single record anymore. Use first() or singleRecord() instead
  • logger option on store is no longer available. openrecord now uses the debug module
  • Drop support for NodeJS lower version 4

raw joins

17 Jul 10:36
Compare
Choose a tag to compare

I've added the ability to run raw joins via .join('JOIN foo ON...')
or via .join(['JOIN foo ON foo.id=? ...', ['bar']])

Postgres json/jsonb support + small bugfix for uuid primary key

03 Jun 13:20
Compare
Choose a tag to compare

Bugfixes + License change

10 Mar 18:27
Compare
Choose a tag to compare

Some small bugfixes, dependency upgrades and license change to MIT