Skip to content

Instantly share code, notes, and snippets.

@suissa
Last active July 26, 2021 02:14
Show Gist options
  • Save suissa/64d2c24bf8faa41860c5e44ae9d6640d to your computer and use it in GitHub Desktop.
Save suissa/64d2c24bf8faa41860c5e44ae9d6640d to your computer and use it in GitHub Desktop.
Vou refatorar esse meu code
const mongoose = require('mongoose')
const moleculesPath = './../modules/'
const organellesPath = './../_organelles/'
module.exports = (DNA, Molecule) => {
const Organism = mongoose.model(DNA.name, Molecule) // deixar generico
const Organelles = require('./../_config/organism/organelles.default')
const OrganellesCell =
(Array.isArray(DNA.organelles))
? (Array.isArray(DNA.middlewares))
? DNA.organelles.concat(Organelles).concat(DNA.middlewares)
: DNA.organelles.concat(Organelles)
: Organelles
const createOrganelles = (acc, name) =>
Object.assign(acc, {
[name]: require(organellesPath+name)(Organism, DNA.populate)})
return OrganellesCell.reduce(createOrganelles, {name: DNA.name})
}
@suissa
Copy link
Author

suissa commented Mar 29, 2017

Primeiramente irei refatorar o teste de algo eh um array verificando se possui a fn map

const mongoose = require('mongoose')
const moleculesPath = './../modules/'
const organellesPath = './../_organelles/'

module.exports = (DNA, Molecule) => {

  const Organism = mongoose.model(DNA.name, Molecule)
  const Organelles = require('./../_config/organism/organelles.default')

  const OrganellesCell = 
    ( DNA.organelles.map ) // Array.isArray(DNA.organelles)
      ? ( DNA.middlewares.map ) // Array.isArray(DNA.middlewares)
          ? DNA.organelles.concat(Organelles).concat(DNA.middlewares)
        	: DNA.organelles.concat(Organelles)
      : Organelles

  const createOrganelles = (acc, name) => 
  	Object.assign(acc, {
  		[name]: require(organellesPath+name)(Organism, DNA.populate)})


  return OrganellesCell.reduce(createOrganelles, {name: DNA.name})
}

@suissa
Copy link
Author

suissa commented Mar 29, 2017

Deixando os requires no topo, saudades C <3

const mongoose = require('mongoose')
const Organelles = require('./../_config/organism/organelles.default')
const moleculesPath = './../modules/'
const organellesPath = './../_organelles/'

@suissa
Copy link
Author

suissa commented Mar 29, 2017

Iniciamos a serie de remoçao das fns de dentro do module.exports.

const createOrganism = ( name, Molecule ) => mongoose.model( name, Molecule )

module.exports = (DNA, Molecule) => {

  const Organism = createOrganism( DNA.name, Molecule )

@suissa
Copy link
Author

suissa commented Mar 29, 2017

Criei a createCell que cria a Cell, antiga OrganellesCell

const mongoose = require('mongoose')
const Organelles = require('./../_config/organism/organelles.default')
const moleculesPath = './../modules/'
const organellesPath = './../_organelles/'

const createOrganism = ( name, Molecule ) => 
  mongoose.model( name, Molecule )

const createCell = ( DNA, Organelles ) =>
  ( DNA.organelles.map ) // Array.isArray(DNA.organelles)
    ? ( DNA.middlewares.map ) // Array.isArray(DNA.middlewares)
        ? DNA.organelles.concat(Organelles).concat(DNA.middlewares)
        : DNA.organelles.concat(Organelles)
    : Organelles

module.exports = (DNA, Molecule) => {

  const Organism = createOrganism( DNA.name, Molecule )
  const Cell = createCell( DNA, Organelles )

  const createOrganelles = (acc, name) => 
  	Object.assign(acc, {
  		[name]: require(organellesPath+name)(Organism, DNA.populate)})


  return Cell.reduce(createOrganelles, {name: DNA.name})
}

@suissa
Copy link
Author

suissa commented Mar 29, 2017

Separei a fn createOrganelles onde injeto Organism e DNA.populate para que ela nao acesse vars globais/fora do seu escopo.

return Cell.reduce(createOrganelles( Organism, DNA.populate), {name: DNA.name} )

const mongoose = require('mongoose')
const Organelles = require('./../_config/organism/organelles.default')
const moleculesPath = './../modules/'
const organellesPath = './../_organelles/'

const createOrganism = ( name, Molecule ) => 
  mongoose.model( name, Molecule )

const createCell = ( DNA, Organelles ) =>
  ( DNA.organelles.map ) // Array.isArray(DNA.organelles)
    ? ( DNA.middlewares.map ) // Array.isArray(DNA.middlewares)
        ? DNA.organelles.concat(Organelles).concat(DNA.middlewares)
        : DNA.organelles.concat(Organelles)
    : Organelles

const createOrganelles = ( Organism, populate ) => ( acc, name ) => 
  Object.assign( acc, {
    [name]: require( organellesPath+name )( Organism, populate )
  } )

module.exports = (DNA, Molecule) => {

  const Organism = createOrganism( DNA.name, Molecule )
  const Cell = createCell( DNA, Organelles )

  return Cell.reduce(createOrganelles( Organism, DNA.populate ), {name: DNA.name} )
}

@suissa
Copy link
Author

suissa commented Mar 29, 2017

Entao apenas substitui as fns createOrganism e createCell onde tinha seus valores salvos em suas consts.

const mongoose = require('mongoose')
const Organelles = require('./../_config/organism/organelles.default')
const moleculesPath = './../modules/'
const organellesPath = './../_organelles/'

const createOrganism = ( name, Molecule ) => 
  mongoose.model( name, Molecule )

const createCell = ( DNA, Organelles ) =>
  ( DNA.organelles.map ) // Array.isArray(DNA.organelles)
    ? ( DNA.middlewares.map ) // Array.isArray(DNA.middlewares)
        ? DNA.organelles.concat(Organelles).concat(DNA.middlewares)
        : DNA.organelles.concat(Organelles)
    : Organelles

const createOrganelles = ( Organism, populate ) => ( acc, name ) => 
  Object.assign( acc, {
    [name]: require( organellesPath+name )( Organism, populate )
  } )

module.exports = (DNA, Molecule) => 
  createCell( DNA, Organelles )
    .reduce( createOrganelles( createOrganism( DNA.name, Molecule ), 
                                DNA.populate), 
                                {name: DNA.name} 
                              )

@suissa
Copy link
Author

suissa commented Mar 29, 2017

Para finalizar encapsulei as fns chamadas no module.exports para deixar mais legivel, agora a fn mestre eh aMakeLife que executa a Mitosis na Cell.

Foi coisa simples, mas espero que possa ajudar alguem e claro se vc quiser comentar com a sua refatoraçao eu agradeço.

const mongoose = require('mongoose')
const Organelles = require('./../_config/organism/organelles.default')
const moleculesPath = './../modules/'
const organellesPath = './../_organelles/'

const createOrganism = ( name, Molecule ) => 
  mongoose.model( name, Molecule )

const createCell = ( DNA, Organelles ) =>
  ( DNA.organelles.map ) // Array.isArray(DNA.organelles)
    ? ( DNA.middlewares.map ) // Array.isArray(DNA.middlewares)
        ? DNA.organelles.concat(Organelles).concat(DNA.middlewares)
        : DNA.organelles.concat(Organelles)
    : Organelles

const createOrganelles = ( Organism, populate ) => ( acc, name ) => 
  Object.assign( acc, {
    [name]: require( organellesPath+name )( Organism, populate )
  } )

const Mitosis = ( DNA, Molecule ) => ( Cell ) => 
  Cell.reduce( createOrganelles(  createOrganism( DNA.name, Molecule ), 
                                  DNA.populate ), 
                                {name: DNA.name} 
                                )

const MakeLife = ( DNA, Molecule, Organelles ) => 
  Mitosis( DNA, Molecule )(createCell( DNA, Organelles ))
    
module.exports = ( DNA, Molecule ) => MakeLife( DNA, Molecule, Organelles ) 

@rafaelassumpcao
Copy link

po curti essa ideia de mostrar refatoração no git em passo a passo.

@JohnsonMauro
Copy link

Beautiful Suissa Sensei!

@higordiego
Copy link

Coisa linda... hehe

@tuchedsf
Copy link

top...

@suissa
Copy link
Author

suissa commented Mar 29, 2017

Renomei algumas coisas para melhorar a conceituaçao biológica

const mongoose = require('mongoose')
const Organelles = require('./../_config/organism/organelles.default')
const moleculesPath = './../modules/'
const organellesPath = './../_organelles/'

const createCytoplasm = ( name, Molecule ) => 
  mongoose.model( name, Molecule )

const createCell = ( DNA, Organelles ) =>
  ( DNA.organelles.map ) // Array.isArray(DNA.organelles)
    ? ( DNA.middlewares.map ) // Array.isArray(DNA.middlewares)
        ? Transcript( DNA, Organelles, `with middlewares` )
        : Transcript( DNA, Organelles )
    : Organelles

const createOrganelles = ( Organism, organellesPath ) => 
  ( acc, name ) => 
    Object.assign( acc, {
      [ name ]: require( organellesPath+name )( Organism )
    } )

const Transcript = ( DNA, Organelles, middlewares = false ) => 
  ( middlewares )
    ? DNA.organelles.concat(Organelles)
    : DNA.organelles.concat(Organelles).concat(DNA.middlewares)

const Synthesis = ( DNA, Molecule ) => 
  createOrganelles( createCytoplasm( DNA.name, Molecule ), organellesPath )

const Mitosis = ( DNA, Molecule ) => ( Cell ) => 
  Cell.reduce( Synthesis( DNA, Molecule ), {name: DNA.name} )

const MakeLife = ( DNA, Molecule, Organelles ) => 
  Mitosis( DNA, Molecule )( createCell( DNA, Organelles ) )
    
module.exports = ( DNA, Molecule ) => MakeLife( DNA, Molecule, Organelles )

@suissa
Copy link
Author

suissa commented Mar 29, 2017

Galero da Biologia preciso de sugestoes p/ nomear os middlewares das rotas conceituando com alguma organela existente.

@suissa
Copy link
Author

suissa commented Mar 29, 2017

Q q vcs acham de nomear os middlewares como Complexo de Golgi?

analisem vcs mesmos.

https://pt.wikipedia.org/wiki/Complexo_de_Golgi

Essas vesículas que brotam de regiões do RE que não estão recobertas por ribossomos levam as proteínas para outra organela limitada por membrana, o aparato de Golgi, mais especificamente em sua rede cis.
Depois que as proteínas secretadas e as de membrana passam por modificações no Golgi, são transportadas para fora por uma série de vesículas que parecem brotar da porção trans. Algumas vesículas transportam proteínas de membrana destinadas para membrana plasmática ou proteínas solúveis que serão liberadas da superfície celular; outras levam proteínas solúveis ou de membrana aos lisossomos e outras organelas.

@suissa
Copy link
Author

suissa commented Mar 29, 2017

https://github.com/suissa/OpenBills/blob/master/api/_factories/organism.js

/**
IN:
DNA { name: 'Bill',
  organelles: 
   [ 'find',
     'find',
     'create',
     'getSchema',
     'findByFilter',
     'findAllPopulate',
     'findById',
     'findByIdPopulate',
     'update',
     'remove' ],
  middlewares: [ 'test' ] }
Molecule {
  obj: 
   { active: 
      { type: [Function: Boolean],
        ATOM_NAME: 'active',
        required: true,
        default: true },
     name: { type: [Function: String], ATOM_NAME: 'name' },
     type: 
      { type: [Function: String],
        ATOM_NAME: 'type',
        required: true,
        enum: [Object],
        default: 'mercado' },
     amount: { type: [Function: Number], ATOM_NAME: 'amount', min: 0 },
     deadline: { type: [Function: Date], ATOM_NAME: 'deadline' },
     interest: { type: [Function: Number], ATOM_NAME: 'interest', default: 0 },
     paid_at: { type: [Function: Date], ATOM_NAME: 'paid_at' },
     created_at: 
      { type: [Function: Date],
        ATOM_NAME: 'created_at',
        default: [Function: now] } },
  paths: 
   { active: 
      SchemaBoolean {
        path: 'active',
        instance: 'Boolean',
        validators: [Object],
        setters: [],
        getters: [],
        options: [Object],
        _index: null,
        isRequired: true,
        requiredValidator: [Function],
        originalRequiredValue: true,
        defaultValue: true },
     name: 
      SchemaString {
        enumValues: [],
        regExp: null,
        path: 'name',
        instance: 'String',
        validators: [],
        setters: [],
        getters: [],
        options: [Object],
        _index: null },
     type: 
      SchemaString {
        enumValues: [Object],
        regExp: null,
        path: 'type',
        instance: 'String',
        validators: [Object],
        setters: [],
        getters: [],
        options: [Object],
        _index: null,
        isRequired: true,
        requiredValidator: [Function],
        originalRequiredValue: true,
        enumValidator: [Function],
        defaultValue: 'mercado' },
     amount: 
      SchemaNumber {
        path: 'amount',
        instance: 'Number',
        validators: [Object],
        setters: [],
        getters: [],
        options: [Object],
        _index: null,
        minValidator: [Function] },
     deadline: 
      SchemaDate {
        path: 'deadline',
        instance: 'Date',
        validators: [],
        setters: [],
        getters: [],
        options: [Object],
        _index: null },
     interest: 
      SchemaNumber {
        path: 'interest',
        instance: 'Number',
        validators: [],
        setters: [],
        getters: [],
        options: [Object],
        _index: null,
        defaultValue: 0 },
     paid_at: 
      SchemaDate {
        path: 'paid_at',
        instance: 'Date',
        validators: [],
        setters: [],
        getters: [],
        options: [Object],
        _index: null },
     created_at: 
      SchemaDate {
        path: 'created_at',
        instance: 'Date',
        validators: [],
        setters: [],
        getters: [],
        options: [Object],
        _index: null,
        defaultValue: [Function: now] },
     _id: 
      ObjectId {
        path: '_id',
        instance: 'ObjectID',
        validators: [],
        setters: [Object],
        getters: [],
        options: [Object],
        _index: null,
        defaultValue: [Function: defaultId] } },
  subpaths: {},
  virtuals: { id: VirtualType { path: 'id', getters: [Object], setters: [], options: {} } },
  singleNestedPaths: {},
  nested: {},
  inherits: {},
  callQueue: 
   [ [ 'pre', [Object] ],
     [ 'pre', [Object] ],
     [ 'pre', [Object] ],
     [ 'pre', [Object] ] ],
  _indexes: [],
  methods: {},
  statics: {},
  tree: 
   { active: 
      { default: true,
        required: true,
        ATOM_NAME: 'active',
        type: [Function: Boolean] },
     name: { ATOM_NAME: 'name', type: [Function: String] },
     type: 
      { default: 'mercado',
        enum: [Object],
        required: true,
        ATOM_NAME: 'type',
        type: [Function: String] },
     amount: { min: 0, ATOM_NAME: 'amount', type: [Function: Number] },
     deadline: { ATOM_NAME: 'deadline', type: [Function: Date] },
     interest: { default: 0, ATOM_NAME: 'interest', type: [Function: Number] },
     paid_at: { ATOM_NAME: 'paid_at', type: [Function: Date] },
     created_at: 
      { default: [Function: now],
        ATOM_NAME: 'created_at',
        type: [Function: Date] },
     _id: { type: [Object], auto: true },
     id: VirtualType { path: 'id', getters: [Object], setters: [], options: {} } },
  query: {},
  childSchemas: [],
  s: 
   { hooks: Kareem { _pres: {}, _posts: {} },
     kareemHooks: 
      { count: true,
        find: true,
        findOne: true,
        findOneAndUpdate: true,
        findOneAndRemove: true,
        insertMany: true,
        update: true,
        updateMany: true,
        updateOne: true } },
  options: 
   { retainKeyOrder: false,
     typeKey: 'type',
     id: true,
     noVirtualId: false,
     _id: true,
     noId: false,
     validateBeforeSave: true,
     read: null,
     shardKey: null,
     autoIndex: null,
     minimize: true,
     discriminatorKey: '__t',
     versionKey: '__v',
     capped: false,
     bufferCommands: true,
     strict: true } }
*/

@suissa
Copy link
Author

suissa commented Mar 29, 2017

/** 
OUT:
MakeLife { name: 'Bill',
   find: [Function],
   create: [Function],
   getSchema: [Function],
   findByFilter: [Function],
   findAllPopulate: [Function],
   findById: [Function],
   findByIdPopulate: [Function],
   update: [Function],
   remove: [Function],
   findOne: [Function],
   test: [Function] }
*/

@rafaeljourdan
Copy link

MakeLife tirou onda!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment