base-domain
Version:
simple module to help build Domain-Driven Design
312 lines (223 loc) • 5.71 kB
text/coffeescript
'use strict'
{ TYPES } = require './type-info'
###*
parses model properties and classifies them
ModelProps
base-domain
###
class ModelProps
###*
{String} modelName
{Object} properties
{BaseModule} modl
###
constructor: (, properties, modl) ->
###*
property whose type is CREATED_AT
{String} createdAt
###
= null
###*
property whose type is UPDATED_AT
{String} updatedAt
###
= null
###*
properties whose type is DATE, CREATED_AT and UPDATED_AT
{Array(String)} dates
###
= []
# private
= []
= {}
= {}
= {}
properties, modl
###*
parse props by type
parse
###
parse: (properties, modl) ->
for prop, typeInfo of properties
(prop, typeInfo, modl)
return
###*
parse one prop by type
parseProp
###
parseProp: (prop, typeInfo, modl) ->
[prop] = typeInfo
switch typeInfo.typeName
when 'DATE'
.push prop
when 'CREATED_AT'
= prop
.push prop
when 'UPDATED_AT'
= prop
.push prop
when 'MODEL'
(prop, typeInfo, modl)
return
###*
parse submodel prop
parseSubModelProp
###
parseSubModelProp: (prop, typeInfo, modl) ->
.push prop
if not modl?
console.error("""
base-domain:ModelProps could not parse property info of '#{prop}'.
(@TYPES.#{typeInfo.typeName}, model=#{typeInfo.model}.)
Construct original model '#{@modelName}' with RootInterface.
new Model(obj, facade)
facade.createModel('#{@modelName}', obj)
""")
return
if modl.getModel(typeInfo.model).isEntity
[prop] = true
idTypeInfo = TYPES.SUB_ID modelProp: prop, entity: typeInfo.model, omit: typeInfo.omit
(typeInfo.idPropName, idTypeInfo, modl)
return
###*
get all prop names
getAllProps
{Array(String)}
###
getAllProps: ->
Object.keys
###*
get all entity prop names
getEntityProps
{Array(String)}
###
getEntityProps: ->
Object.keys
###*
get all model prop names
getSubModelProps
{Array(String)}
###
getSubModelProps: ->
.slice()
###*
check if the given prop is entity prop
isEntity
{String} prop
{Boolean}
###
isEntity: (prop) ->
[prop]?
###*
check if the given prop is model prop
isModel
{String} prop
{Boolean}
###
isModel: (prop) ->
[prop]?.typeName is 'MODEL'
###*
check if the given prop is submodel's id
isId
{String} prop
{Boolean}
###
isId: (prop) ->
[prop]?.typeName is 'SUB_ID'
###*
check if the given prop is enum
isEnum
{String} prop
{Boolean}
###
isEnum: (prop) ->
[prop]?.typeName is 'ENUM'
###*
get value - enum pair
isEnumDic
{String} prop
{Object}
###
getEnumDic: (prop) ->
[prop]?.numsByValue
###*
get values of enum
isEnumValues
{String} prop
{Array(String)}
###
getEnumValues: (prop) ->
[prop]?.values.slice()
###*
get entity prop of the given idPropName
getEntityPropByIdProp
{String} idPropName
{String} submodelProp
###
getEntityPropByIdProp: (idProp) ->
[idProp]?.modelProp
###*
check if the given prop is tmp prop
isOmitted
{String} prop
{Boolean}
###
isOmitted: (prop) ->
!![prop]?.omit
###*
get prop name of id of entity prop
getIdPropByEntityProp
{String} prop
{String} idPropName
###
getIdPropByEntityProp: (entityProp) ->
[entityProp]?.idPropName
###*
get model name of model prop
getSubModelProps
{String} prop
{String} model name
###
getSubModelName: (prop) ->
[prop]?.model
###*
check if the prop is optional
isOptional
{String} prop
{Boolean}
###
isOptional: (prop) ->
!![prop]?.optional
###*
get the default value of the prop
getDefaultValue
{String} prop
{any} defaultValue
###
getDefaultValue: (prop) ->
[prop]?.default
module.exports = ModelProps