@startupjs/orm
ORM system for Racer.js and ShareDB
Last updated a day ago by yska .
MIT · Original npm · Tarball · package.json
$ cnpm install @startupjs/orm 
SYNC missed versions from official npm registry.

startupjs racer-orm

ORM system for Racer.js and ShareDB

What it does

Lets you automatically override your scope models (created with .at() and .scope()) with the additional methods.

Usage

Add the plugin:

import Racer from 'racer'
import racerOrm from 'racer-orm'
Racer.use(racerOrm)

Then start adding the ORM entities to your model. Each ORM Entity must be inherited from Model.ChildModel.


import { Model } from 'racer'

class PlayerModel extends Model.ChildModel {
  alert (message) {
    this.set('alert', this.get('name') + ', ' + message)
    this.setDiff('showAlert', true)
  }
}

class GamesModel extends Model.ChildModel {
  async addNew (userId = 'system', params = {}) {
    let gameId = this.id()
    await this.add('games', {
      name: 'Dummy Game',
      ...params,
      id: gameId,
      userId,
      playerIds: [],
      createdAt: Date.now()
    })
    return gameId
  }
}

class GameModel extends Model.ChildModel {
  async alertPlayers (message) {
    let playerIds = this.get('playerIds')
    let playersQuery = this.root.query('players', { _id: { $in: playerIds } })
    await this.subscribe(playersQuery)
    for (let playerId of playersQuery.getIds()) {
      this.scope('players.' + playerId).alert(message)
    }
  }

  async addPlayer (userId, params = {}) {
    if (!userId) throw new Error('userId required')
    var playerId = this.id()
    await this.root.add('players', {
      ...params,
      id: playerId,
      userId,
      createdAt: Date.now()
    })
    await this.push('playerIds', playerId)
    return playerId
  }
}

racer.orm('games', GamesModel)
racer.orm('games.*', GameModel)
racer.orm('players.*', PlayerModel)

// ...

async function main ($root) {
  let $games = $root.scope('games')
  let gameId = await $games.addNew('userId1', { name: 'Cool game' })
  let $game = $games.at(gameId)
  for (let userIds of ['userId1', 'userId2', 'userId3']) {
    await $game.addPlayer(userIds)
  }
  $game.alertPlayers('please join the game!')
}

// ...

Factory

Sometimes you want to dynamically decide which ORM to use based on the document's data. Factory let you do that.

Example:

class BasePlayerModel extends Model.ChildModel {
  getColor () {
    throw new Error('Player color is unknown')
  }
}

class AlliedPlayerModel extends BasePlayerModel {
  getColor () {
    return 'blue'
  }
}

class RivalPlayerModel extends BasePlayerModel {
  getColor () {
    return 'red'
  }
}

function PlayerFactory ($player, $parent) {
  // $player here is going to be just a pure scoped model
  let playerTeamId = $player.get('teamId')
  let $root = $player.root
  let myTeamId = $root.get('_session.myTeamId')

  // you have to always pass `$parent` when manually
  // instantiating the ORM Entity
  if (!playerTeamId || !myTeamId) return new BasePlayerModel($parent)

  if (playerTeamId === myTeamId) {
    return new AlliedPlayerModel($parent)
  } else {
    return new RivalPlayerModel($parent)
  }
}
PlayerFactory.factory = true

racer.orm('players.*', PlayerFactory)

Alias

You can optionally specify an alias for the ORM Entity:

racer.orm('players.*', PlayerModel, 'Player')

This will allow you to explicitly specify in .at() and .scope() which ORM Entity to use even for the unknown path patters:

let playerId = 'playerId1'
// will create the PlayerModel, since it matches the specified path pattern:
model.scope('players.' + playerId).alert('please join the game!')

// The following will also create the PlayerModel
// even though '_session.myPlayer' wasn't specified in the orm path patterns:
model.scope('_session.myPlayer', 'Player').alert('please join the game!')

IMPORTANT: Note, that this is a bad practice and must only be used in the edge cases.

It's always better to list all your path patterns explicitly and don't use aliases at all:

racer.orm('players.*', PlayerModel)
racer.orm('_session.myPlayer', PlayerModel)
racer.orm('_session.rivalPlayer', PlayerModel)

JSON Schema validation of documents.

Installation

  1. in server/index.js add validateSchema: true to startupjsServer() options
  2. Go to one of your ORM document entities (for example, UserModel, which targets users.*) and add a static method schema:
import { BaseModel } from 'startupjs/orm'

export default class UserModel extends BaseModel {
  static schema = {
    firstName: { type: 'string' },
    lastName: { type: 'string' },
    age: {
      type: 'number',
      multipleOf: 1,
      minimum: 0,
      maximum: 130
    }
  }
}

Notes

  1. Schema is checked on both client-side and server-side.
  2. Schema validation only works in development. So there won't be any performance overheads when NODE_ENV is production
  3. Only ORMs targeting documents path <collection>.* are gonna be parsed for schema definitions.

Licence

MIT

(c) Decision Mapper - http://decisionmapper.com

Current Tags

  • 0.22.0-canary.0                                ...           canary (3 months ago)
  • 0.23.45                                ...           latest (a day ago)
  • 0.22.0-alpha.34                                ...           next (4 months ago)

49 Versions

  • 0.23.45                                ...           a day ago
  • 0.23.44                                ...           a day ago
  • 0.23.32                                ...           a month ago
  • 0.23.0                                ...           3 months ago
  • 0.22.0                                ...           3 months ago
  • 0.22.0-canary.0                                ...           3 months ago
  • 0.22.0-alpha.34                                ...           4 months ago
  • 0.22.0-alpha.24                                ...           4 months ago
  • 0.22.0-alpha.23                                ...           4 months ago
  • 0.22.0-alpha.22                                ...           4 months ago
  • 0.22.0-alpha.20                                ...           4 months ago
  • 0.22.0-alpha.11                                ...           5 months ago
  • 0.22.0-alpha.0                                ...           5 months ago
  • 0.21.1                                ...           5 months ago
  • 0.21.0                                ...           5 months ago
  • 0.20.0                                ...           5 months ago
  • 0.19.2                                ...           5 months ago
  • 0.19.1                                ...           5 months ago
  • 0.19.0                                ...           6 months ago
  • 0.18.4                                ...           6 months ago
  • 0.18.3                                ...           6 months ago
  • 0.18.2                                ...           6 months ago
  • 0.18.1                                ...           6 months ago
  • 0.18.0                                ...           6 months ago
  • 0.17.3                                ...           6 months ago
  • 0.17.2                                ...           6 months ago
  • 0.17.0                                ...           6 months ago
  • 0.16.2                                ...           6 months ago
  • 0.16.0                                ...           6 months ago
  • 0.15.5                                ...           7 months ago
  • 0.15.0                                ...           7 months ago
  • 0.14.1                                ...           8 months ago
  • 0.13.0                                ...           8 months ago
  • 0.12.0                                ...           8 months ago
  • 0.11.0                                ...           9 months ago
  • 0.10.0                                ...           10 months ago
  • 0.9.6                                ...           10 months ago
  • 0.9.0                                ...           10 months ago
  • 0.8.2                                ...           a year ago
  • 0.8.1                                ...           a year ago
  • 0.8.0                                ...           a year ago
  • 0.7.1                                ...           a year ago
  • 0.7.0                                ...           a year ago
  • 0.6.0                                ...           a year ago
  • 0.5.2                                ...           a year ago
  • 0.5.0                                ...           a year ago
  • 0.4.1                                ...           a year ago
  • 0.4.0                                ...           a year ago
  • 0.3.5                                ...           a year ago
Downloads
Today 0
This Week 23
This Month 0
Last Day 23
Last Week 0
Last Month 23
Dependencies (1)
Dev Dependencies (0)
None

Copyright 2014 - 2016 © taobao.org |