API Docs for:
Show:

File: src/lib/dict-factory.coffee


BaseFactory = require './base-factory'


###*
factory of dict

@class DictFactory
@extends BaseFactory
@module base-domain
###
class DictFactory extends BaseFactory

    ###*
    create instance
    ###
    @create: (dictModelName, itemFactory) ->
        new DictFactory(dictModelName, itemFactory)

    ###*
    @constructor
    ###
    constructor: (@dictModelName, @itemFactory) ->
        @getFacade = -> @itemFactory.getFacade()
        super


    ###*
    get model class this factory handles

    @method getModelClass
    @return {Function}
    ###
    getModelClass: ->
        @getFacade().getModel(@dictModelName)



    ###*
    creates an instance of BaseDict by value

    @method createFromObject
    @public
    @param {any} obj
    @return {BaseDict}
    ###
    createFromObject: (obj) ->

        if not obj? or typeof obj isnt 'object'
            return @createEmpty()

        if Array.isArray obj
            return @createFromArray(obj)

        DictModel = @getModelClass()

        { ids, items } = obj

        if items
            delete obj.items
            items = (@createItemFromObject item for key, item of items)
            dict = super(obj).setItems items
            obj.items = items

        else if DictModel.containsEntity()
            delete obj.ids
            dict = super(obj).setIds ids
            obj.ids = ids
        else
            return super(obj)

        return dict


    ###*
    creates an instance of BaseDict from array

    @method createFromArray
    @public
    @param {Array} arr
    @return {BaseDict}
    ###
    createFromArray: (arr) ->

        DictModel = @getModelClass()

        firstValue = arr[0]

        if not firstValue?
            return @createEmpty()

        if typeof firstValue is 'object'
            items = (@createItemFromObject obj for obj in arr)
            return new DictModel().setItems items

        if DictModel.containsEntity()
            return new DictModel().setIds arr

        throw new Error "cannot create #{@constructor.modelName} with arr\n [#{arr.toString()}]"

    ###*
    creates an instance of BaseDict by value

    @method createEmpty
    @private
    @return {BaseDict}
    ###
    createEmpty: ->

        DictModel = @getModelClass()
        return new DictModel().setItems()


    ###*
    create item model

    @method createItemFromObject
    @return {BaseModel}
    ###
    createItemFromObject: (obj) ->
        return @itemFactory.createFromObject(obj)


module.exports = DictFactory