<repo_name>N3Wolf/gesMDL<file_sep>/routes/lacadores.js
const express = require('express');
const router = express.Router();
const passport = require('passport');
const jwt = require('jsonwebtoken');
const config = require('../config/database');
const Lacador = require('../models/lacador');


// List
router.get('/list', (req, res, next) => {
  Lacador.getLacadorList({}, (err, lacadorList) => {
    if (err) throw err;
    if (!lacadorList) {
      return res.json({
        success: false,
        msg: 'Tabela vazia'
      });
    } else {
      return res.json({ lacadorList: lacadorList });
    }
  })
});

// List by Clube id
router.get('/listByClubeId', (req, res, next) => {
  Lacador.getLacadorListByClubeId(req.query.idClube, (err, lacadorList) => {
    if (err) throw err;
    if (!lacadorList) {
      return res.json({
        success: false,
        msg: 'Tabela vazia'
      });
    } else {
      // console.log('lacadorList');
      // console.log(lacadorList);
      return res.json({ lacadorList });
    }
  })
});

// View
router.get('/view', (req, res, next) => {
  //console.log('req.params.idLacador');
  //console.log(req.query.idLacador);
  Lacador.getLacadorById(req.query.idLacador, (err, lacador) => {
    if (!lacador) {
      return res.json({
        success: false,
        msg: 'Erro ao buscar o Laçador de laço desejado. Entre em contato com o suporte técnico do sistema.'
      });
    } else {
      //console.log('lacador(routes)');
      //console.log(lacador);
      res.json({
        lacador: lacador
      });
    }
  })
});

// Edit
router.post('/update', (req, res, next) => {
   console.log('chegou aqui');
   console.log('req.body');
   console.log(req.body);
  Lacador.updateById(req.body, (err, callback) => {

    if (err) {
      console.log(err);
      res.json({
        success: false,
        msg: "Erro ao atualizar o registro do Laçador:",
        erro: err
      });
    } else {
      res.json({
        success: true,
        msg: "Laçador atualizado com sucesso."
      });
    }
  });
});

//Seta o todos os laçadores de um clube como Indepentende;
router.post('/setLacadorIndependenteByClube', (req, res, next) => {
  Lacador.setLacadorIndependenteByClube(req.body['idClubedelaco'], (err, callback) => {
    if (err) {
      console.log(err);
      res.json({
        success: false,
        msg: "Erro ao remover o vinculo entre Clube de laco e os Laçadores",
        erro: err
      });
    } else {
      res.json({
        success: true,
        msg: "Clubes desvinculados dos Laçadores com sucesso."
      });
    }
  });
});

//Seta o todos os laçadores de um clube como Indepentende;
router.post('/setLacadorIndependenteById', (req, res, next) => {
  Lacador.setLacadorIndependenteById(req.body['idLacador'], (err, callback) => {
    if (err) {
      console.log(err);
      res.json({
        success: false,
        msg: "Erro ao remover o vinculo entre Clube de laco e seus Laçadores",
        erro: err
      });
    } else {
      res.json({
        success: true,
        msg: "Clube desvinculado dos Laçadores com sucesso."
      });
    }
  });
});


// Delete
router.post('/remove', (req, res, next) => {
  Lacador.removeLacador(req.body.idLacador, (err, callback) => {
    if (err) {
      console.log(err);
      res.json({
        success: false,
        msg: "Erro ao remover o registro do Laçador."
      });
    } else {
      res.json({
        success: true,
        msg: "Laçador  removido do sistema com sucesso."
      });
    }
  });
});


//Register
router.post('/add', (req, res, next) => {
  let newLacador = new Lacador({
    name: req.body.name,
    cpf: req.body.cpf,
    endereco: req.body.endereco,
    email: req.body.email,
    status: req.body.status,
    idClube: req.body.idClube,
    picture: req.body.picture ? true: null
  })

  //valida unique keys: CNPJ
  //  Lacador.getLacadorByCNPJ(newLacador, (err, federacaoEncontrada) => {
  //    if(err) throw err;
  //    if(!federacaoEncontrada){
  //      return res.json({success: false,msg: 'Já existe uma Federaçao com este CNPJ: '})
  //    }
  //   //  else {
  Lacador.addLacador(newLacador, (err, lacador) => {
    if (err) {
      console.log(err);
      res.json({
        success: false,
        msg: "Erro ao registrar o Laçador."
      });
    } else {
      res.json({
        success: true,
        msg: "Laçador registrado com sucesso.",
        id: lacador._id
      });
    }
  });

});
module.exports = router;
<file_sep>/angular-src/src/app/classes/federacao.ts
export class Federacao {
}
<file_sep>/angular-src/src/app/theme/pages/default/services/lacadores.service.ts
import { Injectable } from '@angular/core';
import { AuthService } from '../services/auth.service';
import { Http, Headers } from '@angular/http';
import 'rxjs/add/operator/map';
import { Observable } from 'rxjs/Observable';

@Injectable()
export class LacadoresService {
  lacador: any;
  constructor(
    private authService: AuthService,
    private http: Http
  ) { }

  getLacadores() {
    let headers = new Headers();
    //headers.append('Authorization', this.authService.authToken);
    headers.append('Content-Type', 'application/json');
    let ep = this.authService.prepEndpoint('lacador/list');
    //console.log('service - getlacadores()');
    return this.http.get(ep, { headers: headers })
      .map(res => res.json())
      .map(res => res['lacadorList']) as Observable<any[]>;;
  }

  getLacadorById(idLacador) {
    let headers = new Headers();
    //headers.append('Authorization', this.authService.authToken);
    headers.append('Content-Type', 'application/json');
    let ep = this.authService.prepEndpoint('lacador/view');
    //console.log('service - getlacadores()');
    return this.http.get(ep, { headers: headers, params: { idLacador: idLacador } })
      .map(res => res.json())
      .map(res => res['lacador']) as Observable<any[]>;;;
  }

  getLacadorByClubeId(idClube) {
    let headers = new Headers();
    //headers.append('Authorization', this.authService.authToken);
    headers.append('Content-Type', 'application/json');
    let ep = this.authService.prepEndpoint('lacador/listByClubeId');

    return this.http.get(ep, { headers: headers, params: { idClube: idClube } })
      .map(res => res.json())
      .map(res => res['lacadorList']) as Observable<any[]>;
  }

  addLacador(lacador) {
    //return new Promise(resolve => resolve(lacador));
    //console.log('passou aqui');
    let headers = new Headers();
    //headers.append('Authorization', this.authService.authToken);
    headers.append('Content-Type', 'application/json');
    let ep = this.authService.prepEndpoint('lacador/add');
    return this.http.post(ep, lacador, { headers: headers })
      .map(res => res.json());
  }

  removeLacador(idLacador) {
    //console.log(2);
    let headers = new Headers();
    //headers.append('Authorization', this.authService.authToken);
    headers.append('Content-Type', 'application/json');
    let ep = this.authService.prepEndpoint('lacador/remove');
    //console.log(3);
    return this.http.post(ep, { idLacador: idLacador }, { headers: headers })
      .map(res => res.json());
  }

  updateLacador(lacador) {
    //console.log(2);
    let headers = new Headers();
    //headers.append('Authorization', this.authService.authToken);
    headers.append('Content-Type', 'application/json');
    let ep = this.authService.prepEndpoint('lacador/update');
    return this.http.post(ep, lacador, { headers: headers })
      .map(res => res.json());
  }

  setLacadorIndependenteByClube(idClubedelaco) {
    //console.log(2);
    let headers = new Headers();
    //headers.append('Authorization', this.authService.authToken);
    headers.append('Content-Type', 'application/json');
    let ep = this.authService.prepEndpoint('lacador/setLacadorIndependenteByClube');
    return this.http.post(ep, { idClubedelaco: idClubedelaco }, { headers: headers })
      .map(res => res.json());
  }

  setLacadorIndependenteById(idLacador) {
    //console.log(2);
    let headers = new Headers();
    //headers.append('Authorization', this.authService.authToken);
    headers.append('Content-Type', 'application/json');
    let ep = this.authService.prepEndpoint('lacador/setLacadorIndependenteById');
    return this.http.post(ep, { idLacador: idLacador }, { headers: headers })
      .map(res => res.json());
  }
}
<file_sep>/angular-src/src/app/shared/appMessages.ts
import {Injectable} from '@angular/core';


@Injectable()

export class appOutputMessages  {

  //   public static erros : any = {
  //     requiredField : "Este campo é obrigatório e não pode ficar em branco.",
  //     min1Field : "Este campo requer ao menos 1 caracter",
  //     min2Field : "Este campo requer ao menos 2 caracteres",
  //     min3Field : "Este campo requer ao menos 3 caracteres",
  //     min4Field : "Este campo requer ao menos 4 caracteres",
  //     min5Field : "Este campo requer ao menos 5 caracteres",
  //     min6Field : "Este campo requer ao menos 5 caracteres",
  //     min7Field : "Este campo requer ao menos 5 caracteres",
  //     min8Field : "Este campo requer ao menos 5 caracteres",
  //     min9Field : "Este campo requer ao menos 5 caracteres",
  //     min10Field : "Este campo requer ao menos 5 caracteres",
  //     minAllField : "Este campo requer o preenchimento de todos os caracteres",
  //     emailInvalid : "Este campo requer um e-mail válido."
  //  };

    public static requiredField : "Este campo é obrigatório e não pode ficar em branco.";
    public static min1Field : "Este campo requer ao menos 1 caracter";
    public static min2Field : "Este campo requer ao menos 2 caracteres";
    public static min3Field : "Este campo requer ao menos 3 caracteres";
    public static min4Field : "Este campo requer ao menos 4 caracteres";
    public static min5Field : "Este campo requer ao menos 5 caracteres";
    public static min6Field : "Este campo requer ao menos 5 caracteres";
    public static min8Field : "Este campo requer ao menos 5 caracteres";
    public static min9Field : "Este campo requer ao menos 5 caracteres";
    public static min7Field : "Este campo requer ao menos 5 caracteres";
    public static min10Field : "Este campo requer ao menos 5 caracteres";
    public static minAllField : "Este campo requer o preenchimento de todos os caracteres";
    public static emailInvalid : "Este campo requer um e-mail válido.";


}
<file_sep>/angular-src/src/app/theme/pages/default/components/users/usersView/usersView.module.ts
import { NgModule } from '@angular/core';
//import { BrowserModule } from '@angular/platform-browser';
import { FormsModule } from '@angular/forms';
import { CommonModule } from '@angular/common';
import { Routes, RouterModule } from '@angular/router';
import { LayoutModule } from '../../../../../layouts/layout.module';
import { DefaultComponent } from '../../../default.component';
import { UsersViewComponent } from './usersView.component';
import {  Validators, ReactiveFormsModule  } from '@angular/forms';

//import { AuthGuard } from '../../guards/auth.guard';
import { AuthService } from '../../../services/auth.service';
import { UserService } from '../../../services/user.service';

//import { SharedModule } from '../../../components/sharedModule.module';

const routes: Routes = [
  {
    "path": "",
    "component": DefaultComponent,
    "children": [
      {
        "path": "",
        "component": UsersViewComponent
      }
    ]
  }
];
@NgModule({
imports: [
  //  BrowserModule,
    FormsModule,
    CommonModule,
    RouterModule.forChild(routes),
    LayoutModule
  ], providers: [
    //FederacaoService,
    AuthService,
    UserService,
    ReactiveFormsModule,
    Validators
  ], exports: [
    RouterModule
  ], declarations: [
    UsersViewComponent
  ]
})
export class usersViewModule {

}
<file_sep>/angular-src/src/app/theme/pages/default/components/users/users.component.ts
import { Component, OnInit, Input, ViewEncapsulation } from '@angular/core';
//Depreciado
//import { ValidateService } from '../../services/validate.service';
import { UserService } from '../../services/user.service';
import { Router } from '@angular/router';
import { ActivatedRoute } from '@angular/router';
import { Helpers } from '../../../../../helpers';


@Component({
  selector: '.m-grid__item.m-grid__item--fluid.m-wrapper',
  templateUrl: './users.component.html',
  styleUrls: ['./users.component.css']
})
export class UsersComponent implements OnInit {
  public objUsers: any;
  public registros: number;
  // @Input() isDetail: Boolean;
  // @Input() paramIdClube: string;

  constructor(

    //Depreciado
    //private validateService: ValidateService,
    private usersService: UserService,
    private router: Router,
    private route: ActivatedRoute
  ) { }

  ngOnInit() {
    this.registros = 0;
    this.usersService.getUsers().subscribe(users => {
      this.registros = users.length;
      this.objUsers = users;
    });
  }

  onEditRequest(idUser) {
    this.router.navigate(['/usersView', { id: idUser, isEdit: true }]);
  }

  onDeleteRequest(idUser, nameUser) {
    if (confirm("Confirma a exclusão do Usuário \'" + nameUser + "\'?")) {
      this.usersService.removeUser(idUser).subscribe(data => {
        if (data.success) {
          //TODO: Mensagem 
          alert('Registro removido com sucesso.');
          location.reload();

        }
      })
    }
  }
  //Ultimo bracket
}
<file_sep>/angular-src/src/app/theme/pages/default/components/usergroups/usergroups.component.ts
import { Component, OnInit, Input, ViewEncapsulation } from '@angular/core';
import { UsergroupService } from '../../services/usergroups.service';
import { UserService } from '../../services/user.service';
//Depreciado
//import { ValidateService } from '../../services/validate.service';
import { Router } from '@angular/router';
import { ActivatedRoute } from '@angular/router';
import { Helpers } from '../../../../../helpers';


@Component({
  selector: '.m-grid__item.m-grid__item--fluid.m-wrapper',
  templateUrl: './usergroups.component.html',
  styleUrls: ['./usergroups.component.css']
})
export class UsergroupsComponent implements OnInit {
  public objUsergroups: any;
  public keys: number;
  public registros: number;
   @Input() isDetail: Boolean;
   @Input() paramIdUsergroup: string;

  constructor(

    //Depreciado
    //private validateService: ValidateService,
    private router: Router,
    private userService: UserService,
    private usergroupsService: UsergroupService,
    private route: ActivatedRoute
  ) { }

  ngOnInit() {
    this.registros = 0;
     if (this.paramIdUsergroup) {
    //   this.usergroupsService.getUsergroupByClubeId(String(this.paramIdClube)).subscribe(usergroups => {
    //     this.registros = usergroups.length;
    //     this.objUsergroups = usergroups;
    //  })
    } else {
      //busca todos os usergroups
      this.usergroupsService.getUsergroups().subscribe(usergroups => {
        this.registros = usergroups.length;
        //let usergroupsList = Object.keys(usergroups).map(function(key) { return usergroups[key]; });
        //this.objUsergroups =   usergroupsList;
        this.objUsergroups = usergroups;
        //conta os registros
        // for (var key in usergroups) {
        //   if (!usergroups.hasOwnProperty(key)) continue;
        //   var obj = usergroups[key];
        //   for (var prop in obj) {
        //      // skip loop if the property is from prototype
        //      this.registros++;
        //       if(!obj.hasOwnProperty(prop)) continue;
        //   }
        // }
      });
    }
  }

  onEditRequest(idUsergroup) {
    this.router.navigate(['/usergroupsView', { id: idUsergroup, isEdit: true }]);
  }

  onDeleteRequest(idUsergroup, nameUsergroup) {
    if (confirm("Confirma a exclusão do laçador \'" + nameUsergroup + "\'?")) {
      this.usergroupsService.removeUsergroup(idUsergroup).subscribe(data => {
        if (data.success) {
          //TODO: Mensagem
          alert('Registro removido com sucesso.');
          location.reload();
        }
      })
    }
  }
  //Ultimo bracket
}
<file_sep>/angular-src/src/app/components/lacadores/lacadores.component.ts
import { Component, OnInit, Input,ViewEncapsulation } from '@angular/core';
import { FederacaoService } from '../../services/federacao.service';
import { ClubesdelacoService } from '../../services/clubesdelaco.service';
import { LacadoresService } from '../../services/lacadores.service';
//Depeciado
//import { ValidateService } from '../../services/validate.service';
import { FlashMessagesService } from 'angular2-flash-messages';
import { Router } from '@angular/router';
//import { ActivatedRoute } from '@angular/router';
import { Lacador } from '../../classes/lacador';

@Component({
  selector: 'app-lacadores', //'.m-grid__item.m-grid__item--fluid.m-wrapper',
  templateUrl: './lacadores.component.html',
  styleUrls: ['./lacadores.component.css'],
  encapsulation: ViewEncapsulation.None,
})
export class LacadoresComponent implements OnInit {
  public objLacadores: any;
  public keys: number;
  public registros: number;
  @Input() isDetail: Boolean;
  @Input() paramIdClube: string;

  constructor(

    //Depeciado
    //private validateService: ValidateService,
    private flashMessage: FlashMessagesService,
    private federacaoService: FederacaoService,
    private router: Router,
    private clubesdelacoService: ClubesdelacoService,
    private lacadoresService: LacadoresService,
    //private route: ActivatedRoute
  ) { }

  ngOnInit() {
    //console.log('isDetail: ' + this.isDetail);
    //console.log('paramIdClube??: ' + this.paramIdClube['paramIdClube']);
    this.registros = 0;
    if (this.paramIdClube) {
      this.lacadoresService.getLacadorByClubeId(String(this.paramIdClube)).subscribe(lacadores => {
        this.registros = lacadores.length;
        this.objLacadores = lacadores;
        //let lacadoresList = Object.keys(lacadores).map(function(key) { return lacadores[key]; });
        //this.objLacadores = lacadoresList;

      })
    } else {
      //busca todos os lacadores
      this.lacadoresService.getLacadores().subscribe(lacadores => {
        this.registros = lacadores.length;
        //let lacadoresList = Object.keys(lacadores).map(function(key) { return lacadores[key]; });
        //this.objLacadores =   lacadoresList;
        this.objLacadores = lacadores;
        //conta os registros
        // for (var key in lacadores) {
        //   if (!lacadores.hasOwnProperty(key)) continue;
        //   var obj = lacadores[key];
        //   for (var prop in obj) {
        //      // skip loop if the property is from prototype
        //      this.registros++;
        //       if(!obj.hasOwnProperty(prop)) continue;
        //   }
        // }
      });
    }

    //this.federacoes.count = 1 ;// = this.federacoes.length;
  }

  onEditRequest(idLacador) {
    this.router.navigate(['/lacadoresView', { id: idLacador, isEdit: true }]);
  }

  onDeleteRequest(idLacador, nameLacador) {
    if (confirm("Confirma a exclusão do laçador \'" + nameLacador + "\'?")) {
      this.lacadoresService.removeLacador(idLacador).subscribe(data => {
        if (data.success) {
          this.flashMessage.show('Registro removido com sucesso.', { cssClass: 'alert-success', timeout: 5000 });
          location.reload();
          //this.router.navigate(['/federacao']);
        }
      })
    }
  }
  //Ultimo bracket
}
<file_sep>/angular-src/src/app/auth/_services/authentication.service.ts
import { Injectable } from "@angular/core";
import { Http, Response, Headers } from "@angular/http";
import "rxjs/add/operator/map";
import { tokenNotExpired } from 'angular2-jwt';

@Injectable()
export class AuthenticationService {
  authToken: any;
  user: any;
  isDev: boolean;

  constructor(private http: Http) {
      this.isDev = true; // Change to false before deployment
  }

  login(email: string, password: string) {
    const user = {
      username: email,
      password: <PASSWORD>
    }
    console.log('enviou para autenticar1');
     this.authenticateUser(user).subscribe(data => {
       let returnUser = data;
       console.log('returnUser');
       console.log(returnUser);
       return returnUser;
     });


    //
    // this.http.post('/api/authenticate', JSON.stringify({ email: email, password: <PASSWORD> }))
    //   .map((response: Response) => {
    //     // login successful if there's a jwt token in the response
    //     let user = response.json();
    //     if (user && user.token) {
    //       // store user details and jwt token in local storage to keep user logged in between page refreshes
    //       localStorage.setItem('currentUser', JSON.stringify(user));
    //     }
    //   });
  }


    registerUser(user) {
      let headers = new Headers();
      headers.append('Content-Type', 'application/json');
      let ep = this.prepEndpoint('user/register');
      return this.http.post(ep, user, { headers: headers })
        .map(res => res.json());
    }


    authenticateUser(user) {
      let headers = new Headers();
      headers.append('Content-Type', 'application/json');
      let ep = this.prepEndpoint('user/authenticate');
      console.log('enviou para autenticar2');
      return this.http.post(ep, user, { headers: headers })
        .map(res => res.json());
    }

    getProfile() {
      let headers = new Headers();
      this.loadToken();
      headers.append('Authorization', this.authToken);
      headers.append('Content-Type', 'application/json');
      let ep = this.prepEndpoint('user/view');
      let user = localStorage.getItem('user');
      return this.http.get(ep, { headers: headers, params: { user: user } })
        .map(res => res.json());
    }

    storeUserData(token, user) {
      localStorage.setItem('id_token', token);
      localStorage.setItem('user', JSON.stringify(user));
      localStorage.setItem('currentUser', JSON.stringify(user));
      this.authToken = token;
      this.user = user;
    }

    loadToken() {
      const token = localStorage.getItem('id_token');
      this.authToken = token;
    }

    loggedIn() {
      return tokenNotExpired('id_token');
    }

    logout() {
      this.authToken = null;
      this.user = null;
      localStorage.removeItem('id_token');
      localStorage.removeItem('user');
      // remove user from local storage to log user out
      localStorage.removeItem('currentUser');
    }

    prepEndpoint(ep) {
      if (!this.isDev) {
        return ep;
      } else {
        return 'http://localhost:3000/' + ep;
      }
    }
}
<file_sep>/angular-src/src/app/components/clubesdelaco/clubesdelaco.component.ts
import { Component, OnInit } from '@angular/core';
import { FederacaoService } from '../../services/federacao.service';
import { ClubesdelacoService } from '../../services/clubesdelaco.service';
//import { ValidateService } from '../../services/validate.service';
import { FlashMessagesService } from 'angular2-flash-messages';
import { Router } from '@angular/router';

@Component({
  selector: 'app-clubesdelaco',
  templateUrl: './clubesdelaco.component.html',
  styleUrls: ['./clubesdelaco.component.css']
})
export class ClubesdelacoComponent implements OnInit {
  public ClubesList: any;
  public keys: number;
  public registros: number;

  constructor(

    //private validateService: ValidateService,
    private flashMessage: FlashMessagesService,
    private federacaoService: FederacaoService,
    private router: Router,
    private clubesdelacoService: ClubesdelacoService
  ) { }

  ngOnInit() {
    this.clubesdelacoService.getClubesdelaco().subscribe(clubesdelaco => {
      this.ClubesList = clubesdelaco;
      console.log('clubesdelaco');
      console.log(clubesdelaco);

      this.registros = clubesdelaco.length;
      // var clubesdelacoList = Object.keys(clubesdelaco).map(function(key) { return clubesdelaco[key]; });
      // this.ClubesList =   clubesdelacoList;
      // //conta os registros
      // for (var key in clubesdelaco) {
      //   if (!clubesdelaco.hasOwnProperty(key)) continue;
      //   var obj = clubesdelaco[key];
      //       for (var prop in obj) {
      //          // skip loop if the property is from prototype
      //          this.registros++;
      //           if(!obj.hasOwnProperty(prop)) continue;
      //         }
      // }

    })
    //this.federacoes.count = 1 ;// = this.federacoes.length;
  }

  onEditRequest(idClubedelaco) {
    this.router.navigate(['/clubesdelacoView', { id: idClubedelaco, isEdit: true }]);
  }

  onDeleteRequest(idClubedelaco, nameClubedelaco) {
    if (confirm("Confirma a exclusão do clube \'" + nameClubedelaco + "\'?")) {
      this.clubesdelacoService.removeClubedelaco(idClubedelaco).subscribe(data => {
        if (data.success) {
          location.reload();
          this.flashMessage.show('Registro removido com sucesso.', { cssClass: 'alert-success', timeout: 5000 });
          //this.router.navigate(['/federacao']);
        }
      })
    }
  }

  //Ultimo bracket
}
<file_sep>/angular-src/src/app/app.module.ts
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
import { HttpModule } from '@angular/http';
import { RouterModule, Routes } from '@angular/router';

//do metronic
import { ThemeComponent } from './theme/theme.component';
import { LayoutModule } from './theme/layouts/layout.module';
import { BrowserAnimationsModule } from "@angular/platform-browser/animations";

import { AppRoutingModule } from './app-routing.module';
import { AppComponent } from './app.component';
import { ScriptLoaderService } from "./_services/script-loader.service";
import { ThemeRoutingModule } from "./theme/theme-routing.module";
import { AuthModule } from "./auth/auth.module";

//Componentes desenvolvidos
import { NavbarComponent } from './components/navbar/navbar.component';
import { LoginComponent } from './components/login/login.component';
import { RegisterComponent } from './components/register/register.component';
import { HomeComponent } from './components/home/home.component';
import { DashboardComponent } from './components/dashboard/dashboard.component';
import { ProfileComponent } from './components/profile/profile.component';
import { SidenavComponent } from './components/sidenav/sidenav.component';
//import { FooterComponent } from './components/footer/footer.component';
import { ClubesdelacoComponent } from './components/clubesdelaco/clubesdelaco.component';
import { FederacaoComponent } from './components/federacao/federacao.component';
import { LacadoresComponent } from './components/lacadores/lacadores.component';
import { FederacaoViewComponent } from './components/federacao/federacaoView/federacaoView.component';
import { FederacaoAddComponent } from './components/federacao/federacao-add/federacao-add.component';
import { ClubesdelacoViewComponent } from './components/clubesdelaco/clubesdelacoView/clubesdelacoView.component';
//import { LacadoresViewComponent } from './components/lacadores/lacadoresView/lacadoresView.component';

//Servi�os desenvolvidos
//import { ValidateService } from './services/validate.service';
import { AuthService } from './services/auth.service';
import { FederacaoService } from './services/federacao.service';
import { ClubesdelacoService } from './services/clubesdelaco.service';
import { LacadoresService } from './services/lacadores.service';

//Guardas desenvolvidas
import { AuthGuard } from './guards/auth.guard';

//third party stuff
import { FlashMessagesModule } from 'angular2-flash-messages';
import { NgbModule, NgbDateParserFormatter } from '@ng-bootstrap/ng-bootstrap';
import { DatepickerConfigComponent } from './components/datepicker-config/datepicker-config.component';
import { MyNgbDateParserFormatter } from './classes/myNgbDateParserFormatter'
//import { BrowserAnimationsModule } from '@angular/platform-browser/animations';


const appRoutes: Routes = [
  // { path: '', component: HomeComponent },
  // { path: 'register', component: RegisterComponent },
  // { path: 'login', component: LoginComponent },
  // { path: 'dashboard', component: DashboardComponent, canActivate: [AuthGuard] },
  // { path: 'profile', component: ProfileComponent, canActivate: [AuthGuard] },
  // { path: 'federacao', component: FederacaoComponent, canActivate: [AuthGuard] },
  // { path: 'federacaoView', component: FederacaoViewComponent, canActivate: [AuthGuard] },
  // { path: 'clubesdelaco', component: ClubesdelacoComponent, canActivate: [AuthGuard] },
  // { path: 'clubesdelacoView', component: ClubesdelacoViewComponent, canActivate: [AuthGuard] },
  // { path: 'lacadores', component: LacadoresComponent, canActivate: [AuthGuard] },
  //{ path: 'lacadoresView', component: LacadoresViewComponent, canActivate: [AuthGuard] }
  //resto das routes aqui
];

@NgModule({
  declarations: [
    ThemeComponent,
    AppComponent,
    NavbarComponent,
    LoginComponent,
    RegisterComponent,
    HomeComponent,
    DashboardComponent,
    ProfileComponent,
    SidenavComponent,
    // FooterComponent,
    ClubesdelacoComponent,
    FederacaoComponent,
    LacadoresComponent,
    FederacaoViewComponent,
    FederacaoAddComponent,
    ClubesdelacoViewComponent,
    //LacadoresViewComponent,
    DatepickerConfigComponent
  ],
  imports: [
    LayoutModule,
    BrowserModule,
    BrowserAnimationsModule,
    AppRoutingModule,
    ThemeRoutingModule,
    AuthModule,
    FormsModule,
    ReactiveFormsModule,
    HttpModule,
    RouterModule.forRoot(appRoutes),
    FlashMessagesModule,
    NgbModule.forRoot()
  ],
  providers: [
    ScriptLoaderService,
    //ValidateService,
    AuthService,
    AuthGuard,
    FederacaoService,
    ClubesdelacoService,
    LacadoresService,
    { provide: NgbDateParserFormatter, useClass: MyNgbDateParserFormatter }
  ],
  bootstrap: [AppComponent]
})
export class AppModule { }
<file_sep>/models/lacador.js
const mongoose = require('mongoose');
const bcrypt = require('bcryptjs');
const config = require('../config/database');

const LacadorSchema = mongoose.Schema({
  name: { type: String,  required: true },
  cpf: { type: String, required: true },
  email: { type: String, required: true },
  endereco: { type: String, required: true },
  status: { type: Boolean, required: true },
  picture: {  type: Buffer, contentType: String},
  idClube: { type: String },
  flgIndepentente: { type: Boolean },
  apelido: { type: String },
  foneDDD1: { type: String },
  fone1: { type: String },
  foneDDD2: { type: String },
  fone2: { type: String },
  dataAssociacao: { type: Date }


  //http://localhost:4200/clubesdelacoView;id=59b8d3ccc45a52357ca1cf99;isEdit=true;isDetail=true;idClube=59b8d3ccc45a52357ca1cf99
});

const Lacador = module.exports = mongoose.model('Lacador', LacadorSchema);

// Get
module.exports.getLacadorList = function(all, callback) {
  Lacador.find(all, callback);
}

module.exports.getLacadorListByClubeId = function(idClube, callback) {
  const query = {idClube: idClube }
  Lacador.find(query, callback);
}

module.exports.getLacadorById = function(id, callback) {
  const query = {
    _id: id
  }
  Lacador.findOne(query, callback);
  console.log('callback');
  console.log(callback);
}

module.exports.getLacadorByName = function(name, callback) {
  const query = {
    name: name
  }
  Lacador.findOne(query, callback);
}

module.exports.getLacadorByCpf = function(cpf, callback) {
  const query = {
    cpf: cpf
  }
  Lacador.findOne(query, callback);
}

module.exports.getLacadorByEmail = function(email, callback) {
  const query = {
    email: email
  }
  Lacador.findOne(query, callback);
}

// Add
module.exports.addLacador = function(newLacador, callback) {
  newLacador.save(callback);
};

//remove

module.exports.removeLacador = function(idLacador, callback) {
  const query = {
    _id: idLacador
  }
  Lacador.remove(query, callback);
}

//update
module.exports.updateById = function(lacador, callback) {
  const query = {
    _id: lacador._id
  };
  const newSet = {
    $set: {
      "name": lacador.name,
      "email": lacador.email,
      "cpf": lacador.cpf,
      "endereco": lacador.endereco,
      "status": lacador.status,
      "picture": lacador.picture,
      "idClube": lacador.idClube,
      "apelido": lacador.apelido,
      "foneDDD1": lacador.foneDDD1,
      "fone1": lacador.fone1,
      "foneDDD2": lacador.foneDDD2,
      "fone2": lacador.fone2,
      "dataAssociacao": lacador.dataAssociacao
    }
  };

   console.log('lacador');
   console.log(lacador);
   console.log('newSet');
   console.log(newSet);
  Lacador.updateOne(query, newSet, callback);

}

//Torna todos os laçadores de um clube como Indepententes
module.exports.setLacadorIndependenteByClube = function(idClubedelaco, callback) {
  const query = {
    idClube: idClubedelaco
  };
  const newSet = {
    $set: {
      "flgIndepentente": true,
      "idClube": null
    }
  };

  //  console.log('lacador');
  //  console.log(lacador);
  //  console.log('newSet');
  //  console.log(newSet);
  if(idClubedelaco){
    Lacador.update(query, newSet, callback);
  }
}


//Torna um laçador Indepentente
module.exports.setLacadorIndependenteById = function(idLacador, callback) {
  const query = {
    _id: idLacador
  };
  const newSet = {
    $set: {
      "flgIndepentente": true,
      "idClube": null
    }
  };

  //  console.log('lacador');
  //  console.log(lacador);
  //  console.log('newSet');
  //  console.log(newSet);
  if(idClubedelaco){
    Lacador.update(query, newSet, callback);
  }
}
<file_sep>/routes/federacoes.js
const express = require('express');
const router = express.Router();
const passport = require('passport');
const jwt = require('jsonwebtoken');
const config = require('../config/database');
const Federacao = require('../models/federacao');


// List
router.get('/list', (req, res, next) => {
  //console.log('routes - before /list');
  Federacao.getFederacaoList({}, (err, federacoesList) => {
    if (err) throw err;
    if (!federacoesList) {
      return res.json({
        success: false,
        msg: 'Tabela vazia'
      });
    } else {
      return res.json({
        federacoesList: federacoesList
      });
    }
  })
});

// View
router.get('/view', (req, res, next) => {
  //console.log('req.params.idFederacao');
  //console.log(req.query.idFederacao);
  Federacao.getFederacaoById(req.query.idFederacao, (err, federacao) => {
    if (!federacao) {
      return res.json({
        success: false,
        msg: 'Erro ao buscar a federação desejada. Entre em contato com o suporte técnico do sistema.'
      });
    } else {
      res.json({
        federacao: federacao
      });
    }
  })
});

// Edit
router.post('/update', (req, res, next) => {
  Federacao.updateById(req.body, (err, callback) => {
    if (err) {
      res.json({
        success: false,
        msg: "Erro ao atualizar o registro da Federação:",
        erro: err
      });
    } else {
      res.json({
        success: true,
        msg: "Federação atualizada com sucesso."
      });
    }
  });
});

// Delete
router.post('/remove', (req, res, next) => {
  Federacao.removeFederacao(req.body.idFederacao, (err, callback) => {
    if (err) {
      res.json({
        success: false,
        msg: "Erro ao remover o registro da Federação."
      });
    } else {
      res.json({
        success: true,
        msg: "Federação removida do sistema com sucesso."
      });
    }
  });
});


//Register
router.post('/add', (req, res, next) => {
  let newFederacao = new Federacao({
    name: req.body.name,
    razaosocial: req.body.razaosocial,
    cnpj: req.body.cnpj,
    status: req.body.status,
    email: req.body.email,
  })

  //valida unique keys: CNPJ
  //  Federacao.getFederacaoByCNPJ(newFederacao, (err, federacaoEncontrada) => {
  //    if(err) throw err;
  //    if(!federacaoEncontrada){
  //      return res.json({success: false,msg: 'Já existe uma Federaçao com este CNPJ: '})
  //    }
  //   //  else {
  Federacao.addFederacao(newFederacao, (err, federacao) => {
    if (err) {
      res.json({
        success: false,
        msg: "Erro ao registrar a Federação."
      });
    } else {
      res.json({
        success: true,
        msg: "Federação registrada com sucesso.",
        id: federacao._id
      });
    }
  });

});
module.exports = router;
<file_sep>/angular-src/src/app/components/federacao/federacaoView/federacaoView.component.ts
import { Component, OnInit } from '@angular/core';
import { FederacaoService } from '../../../services/federacao.service';
//Depeciado
//import { ValidateService } from '../../../services/validate.service';
import { FlashMessagesService } from 'angular2-flash-messages';
import { Router } from '@angular/router';
import { ActivatedRoute } from '@angular/router';

@Component({
  selector: 'app-federacaoView',
  templateUrl: './federacaoView.component.html',
  styleUrls: ['./federacaoView.component.css']
})
export class FederacaoViewComponent implements OnInit {
  Federacao = {
    _id: String,
    name: String,
    razaosocial: String,
    cnpj: String,
    status: Boolean,
    email: String
  };
  isView: boolean;
  isInsert: boolean;
  isEdit: boolean;
  idRecord: any;


  constructor(
    //Depeciado
    //private validateService: ValidateService,
    private flashMessage: FlashMessagesService,
    private federacaoService: FederacaoService,
    private router: Router,
    private route: ActivatedRoute
  ) { }

  ngOnInit() {

    this.route.params.subscribe((params) => {
      if (params.id) { this.idRecord = params.id; }
      this.isInsert = true ? params.isInsert : true;
      this.isEdit = true ? params.isEdit : true;
      this.isView = true ? params.isView : true;

    });

    if (!this.isInsert) {
      this.federacaoService.getFederacaoById(this.idRecord).subscribe((result) => {
        this.Federacao = result.federacao;
      })
    } else {
      this.Federacao.name = null;
      this.Federacao.razaosocial = null;
      this.Federacao.status = null;
      this.Federacao.cnpj = null;
      this.Federacao.email = null;
    }
  }

  onFederacaoSubmit() {
    const newFederacao = {
      name: this.Federacao.name,
      cnpj: this.Federacao.cnpj,
      razaosocial: this.Federacao.razaosocial,
      status: true,//this.Federacao.status,
      email: this.Federacao.email
    }

    // Required Fields
  
    // Register user

    if (this.isInsert) {
      this.federacaoService.addFederacao(newFederacao).subscribe(data => {
        if (data.success) {
          //console.log(data);
          this.router.navigate(['federacaoView', { id: data.id, isView: true }]);
          this.flashMessage.show('Federação registrada com sucesso.', { cssClass: 'alert-success', timeout: 3000 });
        } else {
          this.flashMessage.show('Ocorreu um erro ao tentar inserir este registro. Favor entre em contato com o suporte técnico do sistema.', { cssClass: 'alert-danger', timeout: 3000 });
        }
      })
    } else {
      //isEdit
      this.federacaoService.updateFederacao(this.Federacao).subscribe(data => {
        if (data.success) {
          //console.log(data);
          this.router.navigate(['federacaoView', { id: this.Federacao._id, isEdit: true }]);
          this.flashMessage.show('Federação atualizada com sucesso.', { cssClass: 'alert-success', timeout: 3000 });
        } else {
          this.flashMessage.show('Ocorreu um erro ao tentar atualizar o registro. Favor entre em contato com o suporte técnico do sistema.' + data.msg, { cssClass: 'alert-danger', timeout: 3000 });
        }
      })
    }

  }
}
<file_sep>/angular-src/src/app/theme/pages/default/components/sharedModule.module.ts
import { NgModule }       from '@angular/core';
import { CommonModule }   from '@angular/common';
import { FormsModule }    from '@angular/forms';

import { LacadoresComponent } from "./lacadores/lacadores.component"
//import { LacadoresViewComponent } from "./lacadores/lacadoresView/lacadoresView.component"
//import { ClubesdelacoComponent } from "./clubesdelaco/clubesdelaco.component"
//import { ClubesdelacoViewComponent } from "./clubesdelaco/clubesdelacoView/clubesdelacoView.component"


@NgModule({
    imports: [
        CommonModule,
        FormsModule
        //LacadoresComponent
    ],
    declarations: [
      LacadoresComponent
//      LacadoresViewComponent,
//      ClubesdelacoComponent,
//      ClubesdelacoViewComponent,

    ],
    providers: [
    ],
    exports: [
      LacadoresComponent
      //CommonModule,
      //FormsModule

      //LacadoresViewComponent,
      //ClubesdelacoComponent,
      //ClubesdelacoViewComponent,
    ]
})
export class SharedModule {}
<file_sep>/angular-src/src/app/theme/pages/default/components/federacao/federacaoView/federacaoView.component.ts
import { Component, OnInit } from '@angular/core';
import { FederacaoService } from '../../../services/federacao.service';
//Depreciado
//import { ValidateService } from '../../../services/validate.service';
import { FlashMessagesService } from 'angular2-flash-messages';
import { Router } from '@angular/router';
import { ActivatedRoute } from '@angular/router';
import { FormGroup,FormControl, Validators, ReactiveFormsModule  } from '@angular/forms';


@Component({
  selector: '.m-grid__item.m-grid__item--fluid.m-wrapper',
  templateUrl: './federacaoView.component.html',
  styleUrls: ['./federacaoView.component.css']
})
export class FederacaoViewComponent implements OnInit {
  Federacao = {
    _id: String,
    name: String,
    razaosocial: String,
    cnpj: String,
    status: Boolean,
    email: String
  };
  isView: boolean;
  isInsert: boolean;
  isEdit: boolean;
  idRecord: any;


  constructor(
    //Depreciado
    //private validateService: ValidateService,
    private flashMessage: FlashMessagesService,
    private federacaoService: FederacaoService,
    private router: Router,
    private route: ActivatedRoute
  ) { }

  ngOnInit() {

    this.route.params.subscribe((params) => {
      if (params.id) { this.idRecord = params.id; }
      this.isInsert = true ? params.isInsert : true;
      this.isEdit = true ? params.isEdit : true;
      this.isView = true ? params.isView : true;

    });

    if (!this.isInsert) {
      this.federacaoService.getFederacaoById(this.idRecord).subscribe((result) => {
        this.Federacao = result.federacao;
      })
    } else {
      this.Federacao.name = null;
      this.Federacao.razaosocial = null;
      this.Federacao.status = null;
      this.Federacao.cnpj = null;
      this.Federacao.email = null;
    }
  }

  onEditRequest(idFederacao) {
    this.router.navigate(['/federacaoView', { id: idFederacao, isEdit: true }]);
  }


  private markFormGroupTouched(formGroup: FormGroup) {
      (<any>Object).values(formGroup.controls).forEach(control => {
        control.markAsTouched();

        if (control.controls) {
          control.controls.forEach(c => this.markFormGroupTouched(c));
        }
      });
    }


  onFederacaoSubmit(federacaoForm: FormGroup) {
    this.markFormGroupTouched(federacaoForm);
    if (!federacaoForm.valid) {
        console.log("Form com erros!");
    } else {
      const newFederacao = {
        name: this.Federacao.name,
        cnpj: this.Federacao.cnpj,
        razaosocial: this.Federacao.razaosocial,
        status: true,//this.Federacao.status,
        email: this.Federacao.email
      }

      // Required Fields
      //  if(!this.validateService.validateFederacao(federacao)){
      //    this.flashMessage.show('Para continuar é necessário preencher todos os campos', {cssClass:'alert-danger', timeout:3000});
      //    return false;
      //  }
      //
      //   // Validar o email
      //   if(!this.validateService.validateEmail(user.email)){
      //     this.flashMessage.show('Para continuar é necessário informar um e-mail válido', {cssClass:'alert-danger', timeout:3000});
      //     return false;
      //   }
      //

      // Register user

      if (this.isInsert) {
        this.federacaoService.addFederacao(newFederacao).subscribe(data => {
          if (data.success) {
            //console.log(data);
            this.router.navigate(['federacaoView', { id: data.id, isView: true }]);
            //TODO: Mensagem
            alert('Federação registrada com sucesso.');
          } else {
            //TODO: Mensagem
            alert('Ocorreu um erro ao tentar inserir este registro. Favor entre em contato com o suporte técnico do sistema.' + data.msg);
          }
        })
      } else {
        //isEdit
        this.federacaoService.updateFederacao(this.Federacao).subscribe(data => {
          if (data.success) {
            console.log(data);
            alert("Registro alterado com sucesso");
            this.router.navigate(['federacaoView', { id: this.Federacao._id, isEdit: true }]);
            //TODO: Mensagem
            //this.flashMessage.show('Federação atualizada com sucesso.', { cssClass: 'alert-success', timeout: 3000 });
          } else {
            //TODO: Mensagem
            alert('Ocorreu um erro ao tentar atualizar o registro. Favor entre em contato com o suporte técnico do sistema:  ' + data.msg);
          }
        })
      }
    }
  }
}
<file_sep>/angular-src/src/app/components/clubesdelaco/clubesdelacoView/clubesdelacoView.component.ts
import { Component, OnInit } from '@angular/core';
import { FederacaoService } from '../../../services/federacao.service';
import { ClubesdelacoService } from '../../../services/clubesdelaco.service';
//Depeciado
//import { ValidateService } from '../../../services/validate.service';
import { FlashMessagesService } from 'angular2-flash-messages';
import { Router } from '@angular/router';
import { ActivatedRoute } from '@angular/router';
import { NgbDateStruct, NgbDateParserFormatter } from '@ng-bootstrap/ng-bootstrap';
//import { MyNgbDateParserFormatter } from '../../../classes/myNgbDateParserFormatter'

@Component({
  selector: 'app-clubesdelacoView',
  templateUrl: './clubesdelacoView.component.html',
  styleUrls: ['./clubesdelacoView.component.css']
})
export class ClubesdelacoViewComponent implements OnInit {
  Clubedelaco: any = {
    name: String,
    email: String,
    sede: String,
    status: Boolean,
    razaoSocial: String,
    cnpj: String,
    sigla: String,
    dataFundacao: String,
    registroSETEL: String,
    rua: String,
    numeroSala: String,
    bairro: String,
    cep: String,
    cidade: String,
    foneDDD: String,
    fone: String,
    faxDDD: String,
    fax: String,
    nomeRepresentante: String,
    cpfRepresentante: String,
    rgRepresentante: String,
    cargoRepresentante: String,
    foneDDDRepresentante: String,
    foneRepresentante: String,
    atuacao: String
  };


  isView: boolean;
  isInsert: boolean;
  isEdit: boolean;
  idRecord: any;


  constructor(
    //Depeciado
    //private validateService: ValidateService,
    private flashMessage: FlashMessagesService,
    private federacaoService: FederacaoService,
    private router: Router,
    private route: ActivatedRoute,
    private clubesdelacoService: ClubesdelacoService,
    private ngbDateParserFormatter: NgbDateParserFormatter,
  ) { }

  ngOnInit() {

    this.Clubedelaco.name = '';
    this.Clubedelaco.sede = '';
    this.Clubedelaco.email = '';
    this.Clubedelaco.status = '';
    this.Clubedelaco.razaoSocial = '';
    this.Clubedelaco.cnpj = '';
    this.Clubedelaco.sigla = '';
    this.Clubedelaco.dataFundacao = '';
    this.Clubedelaco.registroSETEL = '';
    this.Clubedelaco.rua = '';
    this.Clubedelaco.numeroSala = '';
    this.Clubedelaco.bairro = '';
    this.Clubedelaco.cep = '';
    this.Clubedelaco.cidade = '';
    this.Clubedelaco.foneDDD = '';
    this.Clubedelaco.fone = '';
    this.Clubedelaco.faxDDD = '';
    this.Clubedelaco.fax = '';
    this.Clubedelaco.nomeRepresentante = '';
    this.Clubedelaco.cpfRepresentante = '';
    this.Clubedelaco.rgRepresentante = '';
    this.Clubedelaco.cargoRepresentante = '';
    this.Clubedelaco.foneDDDRepresentante = '';
    this.Clubedelaco.foneRepresentante = '';
    this.Clubedelaco.atuacao = '';

    this.route.params.subscribe((params) => {
      if (params.id) { this.idRecord = params.id; }
      this.isInsert = true ? params.isInsert : true;
      this.isEdit = true ? params.isEdit : true;
      this.isView = true ? params.isView : true;

    });

    if (!this.isInsert) {
      this.clubesdelacoService.getClubedelacoById(this.idRecord).subscribe((result) => {
        this.Clubedelaco = result;
        //pega a data no formato do banco de dados e monta o array do componente Datepicker
        this.Clubedelaco.arrayDataFundacao = this.ngbDateParserFormatter.parse(this.Clubedelaco.dataFundacao);
      })
    }
  }

  onClubesdelacoSubmit() {
    //Monta a data de fundação no formato para o banco de dados.
    if (this.Clubedelaco.arrayDataFundacao) {
      this.Clubedelaco.dataFundacao = new Date(this.Clubedelaco.arrayDataFundacao.year, this.Clubedelaco.arrayDataFundacao.month - 1, this.Clubedelaco.arrayDataFundacao.day);
    } else {
      this.Clubedelaco.dataFundacao = null
    }
    const newClubedelaco = {
      name: this.Clubedelaco.name,
      sede: this.Clubedelaco.sede,
      email: this.Clubedelaco.email,
      status: true, //this.Federacao.status,
      razaoSocial: this.Clubedelaco.razaoSocial,
      cnpj: this.Clubedelaco.cnpj,
      sigla: this.Clubedelaco.sigla,
      dataFundacao: this.Clubedelaco.dataFundacao,
      registroSETEL: this.Clubedelaco.registroSETEL,
      rua: this.Clubedelaco.rua,
      numeroSala: this.Clubedelaco.numeroSala,
      bairro: this.Clubedelaco.bairro,
      cep: this.Clubedelaco.cep,
      cidade: this.Clubedelaco.cidade,
      foneDDD: this.Clubedelaco.foneDDD,
      fone: this.Clubedelaco.fone,
      faxDDD: this.Clubedelaco.faxDDD,
      fax: this.Clubedelaco.fax,
      nomeRepresentante: this.Clubedelaco.nomeRepresentante,
      cpfRepresentante: this.Clubedelaco.cpfRepresentante,
      rgRepresentante: this.Clubedelaco.rgRepresentante,
      cargoRepresentante: this.Clubedelaco.cargoRepresentante,
      foneDDDRepresentante: this.Clubedelaco.foneDDDRepresentante,
      foneRepresentante: this.Clubedelaco.foneRepresentante,
      atuacao: this.Clubedelaco.atuacao
    }
    console.log('this.Clubedelaco');
    console.log(this.Clubedelaco);

    // Required Fields


    // Register user

    if (this.isInsert) {

      this.clubesdelacoService.addClubedelaco(newClubedelaco).subscribe(data => {
        if (data.success) {
          this.router.navigate(['clubesdelacoView', { id: data.id, isView: true }]);
          this.flashMessage.show('Clube de Laço registrado com sucesso.', { cssClass: 'alert-success', timeout: 3000 });
        } else {
          this.flashMessage.show('Ocorreu um erro ao tentar inserir este Clube de laço. Favor entre em contato com o suporte técnico do sistema.', { cssClass: 'alert-danger', timeout: 3000 });
        }
      })
    } else {
      //isEdit
      this.clubesdelacoService.updateClubedelaco(this.Clubedelaco).subscribe(data => {
        if (data.success) {
          this.flashMessage.show('Clube de Laço atualizado com sucesso.', { cssClass: 'alert-success', timeout: 5000 });
          window.scrollTo(0, 0);
          //this.router.navigate(['clubesdelacoView', { id: this.Clubedelaco._id, isEdit: true }]);

        } else {
          this.flashMessage.show('Ocorreu um erro ao tentar atualizar o registro. Favor entre em contato com o suporte técnico do sistema.' + data.msg, { cssClass: 'alert-danger', timeout: 3000 });
        }
      })
    }

  }
}
<file_sep>/angular-src/src/app/components/federacao/federacao-add/federacao-add.component.ts
import { Component, OnInit } from '@angular/core';
import { FederacaoService } from '../../../services/federacao.service';
//Depeciado
//import { ValidateService } from '../../../services/validate.service';
import { FlashMessagesService } from 'angular2-flash-messages';
import { Router } from '@angular/router';

@Component({
  selector: 'app-federacao-add',
  templateUrl: './federacao-add.component.html',
  styleUrls: ['./federacao-add.component.css']
})
export class FederacaoAddComponent implements OnInit {


  constructor(
    //Depeciado
    //private validateService: ValidateService,
    private flashMessage: FlashMessagesService,
    private federacaoService: FederacaoService,
    private router: Router) { }

  ngOnInit() {
  }
};
<file_sep>/angular-src/src/app/theme/pages/default/services/clubesdelaco.service.ts
import { Injectable } from '@angular/core';
import { AuthService } from '../services/auth.service';
import { Http, Headers } from '@angular/http';
import 'rxjs/add/operator/map';
import { Observable } from 'rxjs/Observable';

@Injectable()
export class ClubesdelacoService {
  clubedelaco: any;
  constructor(
    private authService: AuthService,
    private http: Http
  ) { }

  getClubesdelaco() {
    let headers = new Headers();
    //headers.append('Authorization', this.authService.authToken);
    headers.append('Content-Type', 'application/json');
    let ep = this.authService.prepEndpoint('clubedelaco/list');
    //console.log('service - getClubedelaco()');
    return this.http.get(ep, { headers: headers })
      .map(res => res.json())
      .map(res => res['clubedelacoList']) as Observable<any[]>;
  }

  getClubedelacoById(idClubedelaco) {
    let headers = new Headers();
    //headers.append('Authorization', this.authService.authToken);
    headers.append('Content-Type', 'application/json');
    let ep = this.authService.prepEndpoint('clubedelaco/view');
    console.log('service - getClubedelaco()');
    console.log(idClubedelaco);
    return this.http.get(ep, { headers: headers, params: { id: idClubedelaco } })
      .map(res => res.json())
      .map(res => res['clubedelaco']) as Observable<any[]>;
  }

  addClubedelaco(clubedelaco) {
    //return new Promise(resolve => resolve(clubedelaco));
    //console.log('passou aqui');
    let headers = new Headers();
    //headers.append('Authorization', this.authService.authToken);
    headers.append('Content-Type', 'application/json');
    let ep = this.authService.prepEndpoint('clubedelaco/add');
    return this.http.post(ep, clubedelaco, { headers: headers })
      .map(res => res.json());
  }

  removeClubedelaco(idClubedelaco) {
    //console.log(2);
    let headers = new Headers();
    //headers.append('Authorization', this.authService.authToken);
    headers.append('Content-Type', 'application/json');

    let ep = this.authService.prepEndpoint('clubedelaco/remove');
    //console.log(3);
    return this.http.post(ep, { idClubedelaco: idClubedelaco }, { headers: headers })
      .map(res => res.json());
  }

  updateClubedelaco(clubedelaco) {
    //console.log(2);
    let headers = new Headers();
    //headers.append('Authorization', this.authService.authToken);
    headers.append('Content-Type', 'application/json');
    let ep = this.authService.prepEndpoint('clubedelaco/update');
    return this.http.post(ep, clubedelaco, { headers: headers })
      .map(res => res.json());
  }
}
<file_sep>/angular-src/src/app/components/federacao/federacao.component.ts
import { Component, OnInit } from '@angular/core';
import { FederacaoService } from '../../services/federacao.service';
//Depeciado
//import { ValidateService } from '../../services/validate.service';
import { FlashMessagesService } from 'angular2-flash-messages';
import { Router } from '@angular/router';

@Component({
  selector: 'app-federacao',
  templateUrl: './federacao.component.html',
  styleUrls: ['./federacao.component.css']
})
export class FederacaoComponent implements OnInit {
  public objfed: any;
  public keys: number;
  public registros: number;

  constructor(

    //Depeciado
    //private validateService: ValidateService,
    private flashMessage: FlashMessagesService,
    private federacaoService: FederacaoService,
    private router: Router
  ) { }

  ngOnInit() {
    this.federacaoService.getFederacoes().subscribe(federacoes => {
      this.registros = 0;
      var federacaoList = Object.keys(federacoes).map(function(key) { return federacoes[key]; });
      this.objfed = federacaoList;
      //conta os registros
      for (var key in federacoes) {
        if (!federacoes.hasOwnProperty(key)) continue;
        var obj = federacoes[key];
        for (var prop in obj) {
          // skip loop if the property is from prototype
          this.registros++;
          if (!obj.hasOwnProperty(prop)) continue;
        }
      }

    })
    //this.federacoes.count = 1 ;// = this.federacoes.length;
  }

  onEditRequest(idFederacao) {
    this.router.navigate(['/federacaoView', { id: idFederacao, isEdit: true }]);
  }

  onDeleteRequest(idFederacao, nameFederecao) {
    if (confirm("Confirma a exclusão da Federação \'" + nameFederecao + "\'?")) {
      this.federacaoService.removeFederacao(idFederacao).subscribe(data => {
        if (data.success) {
          location.reload();
          this.flashMessage.show('Registro removido com sucesso.', { cssClass: 'alert-success', timeout: 5000 });
          //this.router.navigate(['/federacao']);
        }
      })
    }
  }
}
<file_sep>/angular-src/src/app/auth/auth.component.ts
import { Component, ComponentFactoryResolver, OnInit, ViewChild, ViewContainerRef, ViewEncapsulation } from "@angular/core";
import { ActivatedRoute, Router } from "@angular/router";
import { ScriptLoaderService } from "../_services/script-loader.service";
import { AuthenticationService } from "./_services/authentication.service";
import { AlertService } from "./_services/alert.service";
import { UserService } from "./_services/user.service";
import { AlertComponent } from "./_directives/alert.component";
import { LoginCustom } from "./_helpers/login-custom";
import { Helpers } from "../helpers";

@Component({
  selector: ".m-grid.m-grid--hor.m-grid--root.m-page",
  templateUrl: './templates/login-1.component.html',
  encapsulation: ViewEncapsulation.None
})

export class AuthComponent implements OnInit {
  model: any = {};
  loading = false;
  returnUrl: string;

  @ViewChild('alertSignin', { read: ViewContainerRef }) alertSignin: ViewContainerRef;
  @ViewChild('alertSignup', { read: ViewContainerRef }) alertSignup: ViewContainerRef;
  @ViewChild('alertForgotPass', { read: ViewContainerRef }) alertForgotPass: ViewContainerRef;

  constructor(private _router: Router,
    private _script: ScriptLoaderService,
    private _userService: UserService,
    private _route: ActivatedRoute,
    private _authService: AuthenticationService,
    private _alertService: AlertService,
    private cfr: ComponentFactoryResolver) {
  }

  ngOnInit() {
    this.model.remember = true;
    // get return url from route parameters or default to '/'
    this.returnUrl = this._route.snapshot.queryParams['returnUrl'] || '/';
    this._router.navigate([this.returnUrl]);

    this._script.load('body', 'assets/vendors/base/vendors.bundle.js', 'assets/demo/default/base/scripts.bundle.js')
      .then(() => {
        Helpers.setLoading(false);
        LoginCustom.init();
      });
  }

  signin() {
    this.loading = true;
    const loginCandidate = {
      username: this.model.email,
      password: this.<PASSWORD>
    }
    //chama o método de autenticação de usuário no banco.
    this._authService.authenticateUser(loginCandidate).subscribe(
      data => {
        if (data.success) {
          console.log('sucesso na autenticação');
          this._authService.storeUserData(data.token, data.user); //guarda o token e o user no localstorage
          this._router.navigate([this.returnUrl]);
        } else {
          this.showAlert('alertSignin');
          this._alertService.error(data.msg);
          this.loading = false;
        }
      })
  }

  signup() {
    this.loading = true;
    // Register user
    const user = {
      name: this.model.fullname,
      email: this.model.email,
      username: this.model.email,
      password: <PASSWORD>
    }
    this._authService.registerUser(user).subscribe(data => {
      if (data.success) {
        this.showAlert('alertSignin');
        this._alertService.success('Usuário registrado com sucesso. Agora você pode fazer seu login.', true);
        this.loading = false;
        LoginCustom.displaySignInForm();
        this.model = {};
        //this.flashMessage.show('Usuário registrado com sucesso. Agora você pode fazer seu login.', { cssClass: 'alert-success', timeout: 3000 });
        //this.router.navigate(['/login']);
      } else {
        this.showAlert('alertSignup');
        this._alertService.error('Ocorreu um erro ao tentar registrar seu usuário. Favor entre em contato com o suporte técnico do sistema.');
        this.loading = false;
      }
    })

    // this._userService.create(this.model)
    //   .subscribe(
    //   data => {
    //     this.showAlert('alertSignin');
    //     this._alertService.success('Thank you. To complete your registration please check your email.', true);
    //     this.loading = false;
    //     LoginCustom.displaySignInForm();
    //     this.model = {};
    //   },
    //   error => {
    //     this.showAlert('alertSignup');
    //     this._alertService.error(error);
    //     this.loading = false;
    //   });
  }

  forgotPass() {
    this.loading = true;
    this._userService.forgotPassword(this.model.email)
      .subscribe(
      data => {
        this.showAlert('alertSignin');
        this._alertService.success('Cool! Password recovery instruction has been sent to your email.', true);
        this.loading = false;
        LoginCustom.displaySignInForm();
        this.model = {};
      },
      error => {
        this.showAlert('alertForgotPass');
        this._alertService.error(error);
        this.loading = false;
      });
  }

  showAlert(target) {
    this[target].clear();
    let factory = this.cfr.resolveComponentFactory(AlertComponent);
    let ref = this[target].createComponent(factory);
    ref.changeDetectorRef.detectChanges();
  }
}
<file_sep>/config/database.js
module.exports = {
 database: 'mongodb://gesmdl:<EMAIL>:33104/gesmdl',

  // database: 'mongodb://localhost:27017/gesMDL',
  secret: 'stringsegredo'
}
<file_sep>/angular-src/src/app/theme/pages/default/services/usergroup.service.ts
import { Injectable } from '@angular/core';
import { AuthService } from '../services/auth.service';
import { Http, Headers } from '@angular/http';
import 'rxjs/add/operator/map';
import { Observable } from 'rxjs/Observable';

@Injectable()
export class UsergroupService {
  usergroup: any;
  constructor(
    private authService: AuthService,
    private http: Http
  ) { }

  getUsergroups() {
    let headers = new Headers();
    //headers.append('Authorization', this.authService.authToken);
    headers.append('Content-Type', 'application/json');
    let ep = this.authService.prepEndpoint('usergroup/list');
    //console.log('service - getUsergroups()');
    return this.http.get(ep, { headers: headers })
      .map(res => res.json())
      .map(res => res['usergroupList']) as Observable<any[]>;;
  }

  getUsergroupById(idUsergroup) {
    let headers = new Headers();
    //headers.append('Authorization', this.authService.authToken);
    headers.append('Content-Type', 'application/json');
    let ep = this.authService.prepEndpoint('usergroup/view');
    //console.log('service - getUsergroups()');
    return this.http.get(ep, { headers: headers, params: { idUsergroup: idUsergroup } })
      .map(res => res.json())
      .map(res => res['usergroup']) as Observable<any[]>;;;
  }


  addUsergroup(usergroup) {
    //return new Promise(resolve => resolve(usergroup));
    //console.log('passou aqui');
    let headers = new Headers();
    //headers.append('Authorization', this.authService.authToken);
    headers.append('Content-Type', 'application/json');
    let ep = this.authService.prepEndpoint('usergroup/add');
    return this.http.post(ep, usergroup, { headers: headers })
      .map(res => res.json());
  }

  removeUsergroup(idUsergroup) {
    //console.log(2);
    let headers = new Headers();
    //headers.append('Authorization', this.authService.authToken);
    headers.append('Content-Type', 'application/json');
    let ep = this.authService.prepEndpoint('usergroup/remove');
    //console.log(3);
    return this.http.post(ep, { idUsergroup: idUsergroup }, { headers: headers })
      .map(res => res.json());
  }

  updateUsergroup(usergroup) {
    //console.log(2);
    let headers = new Headers();
    //headers.append('Authorization', this.authService.authToken);
    headers.append('Content-Type', 'application/json');
    let ep = this.authService.prepEndpoint('usergroup/update');
    return this.http.post(ep, usergroup, { headers: headers })
      .map(res => res.json());
  }

}
<file_sep>/models/federacao.js
const mongoose = require('mongoose');
const bcrypt = require('bcryptjs');
const config = require('../config/database');

// Federacao Schema
const FederacaoSchema = mongoose.Schema({
  name: {
    type: String,
    required: true
  },
  email: {
    type: String,
    required: true
  },
  razaosocial: {
    type: String,
    required: true
  },
  cnpj: {
    type: String,
    required: true
  },
  status: {
    type: Boolean,
    required: true
  }
});

const Federacao = module.exports = mongoose.model('Federacao', FederacaoSchema);

// Get
module.exports.getFederacaoList = function(all,callback){
  Federacao.find(all, callback);
}

module.exports.getFederacaoById = function(id, callback){
  const query = {_id: id}
  Federacao.findOne(query, callback);
}

module.exports.getFederacaoByName = function(name, callback){
  const query = {name: name}
  Federacao.findOne(query, callback);
}

module.exports.getFederacaoByCNPJ = function(cnpj, callback){
  const query = {cnpj: cnpj}
  Federacao.findOne(query, callback);
}

module.exports.getFederacaoByEmail = function(email, callback){
  const query = {email: email}
  Federacao.findOne(query, callback);
}

// Add
module.exports.addFederacao = function(newFederacao, callback){
      newFederacao.save(callback);
  };

//remove

module.exports.removeFederacao = function(idFederacao,callback){
  const query = {_id: idFederacao}
  Federacao.remove(query, callback);
}

//update
module.exports.updateById = function(federacao,callback){
  const query = {_id: federacao._id};
  const sets = {
    $set : {
      "name": federacao.name,
      "email": federacao.email,
      "razaosocial": federacao.razaosocial,
      "cnpj": federacao.cnpj,
      "status": federacao.status
    }
  };
  Federacao.updateOne(query, sets, callback);
}
<file_sep>/angular-src/src/app/theme/pages/default/components/lacadores/lacadoresView/lacadoresView.component.ts
import { Component, OnInit, Input, ViewChild } from '@angular/core';
//import { FederacaoService } from '../../../services/federacao.service';
import { ClubesdelacoService } from '../../../services/clubesdelaco.service';
import { LacadoresService } from '../../../services/lacadores.service';
//Depreciado
//import { ValidateService } from '../../../services/validate.service';
import { FlashMessagesService } from 'angular2-flash-messages';
import { Router } from '@angular/router';
//TODO: Quando 2 módulos usando ngDatepicker são abertos em sequencia, ocorre erro ao tentar carregar 2x o ngDatepicker
import { NgbDateStruct, NgbDateParserFormatter } from '@ng-bootstrap/ng-bootstrap';
import { FormGroup,FormControl, Validators, ReactiveFormsModule  } from '@angular/forms';
//import { uiSelect } from 'ui-select';
//import { ngSanitize } from 'angular-sanitize';

import { ActivatedRoute } from '@angular/router';


const now = new Date();

@Component({
  selector: '.m-grid__item.m-grid__item--fluid.m-wrapper',
  templateUrl: './lacadoresView.component.html',
  styleUrls: ['./lacadoresView.component.css']
})
export class LacadoresViewComponent implements OnInit {
  @ViewChild('pictureInput') fileInput;
  Lacador: any = {
    _id: String,
    name: String,
    cpf: String,
    endereco: String,
    email: String,
    picture: Blob,
    status: Boolean,
    idClube: String,
    nameClube: String, // não salvar no DB
    flgIndepentente: Boolean,
    apelido: String,
    foneDDD1: String,
    fone1: String,
    foneDDD2: String,
    fone2: String,
    dataAssociacao: Date
  };
  isView: boolean;
  isInsert: boolean;
  isEdit: boolean;
  idRecord: any;
  @Input() requestIdClube
  Clubedelaco = [];

  constructor(
    //Depreciado
    //private validateService: ValidateService,
    private flashMessage: FlashMessagesService,
    //private federacaoService: FederacaoService,
    private router: Router,
    private route: ActivatedRoute,
    private clubesdelacoService: ClubesdelacoService,
    private lacadoresService: LacadoresService,
    private ngbDateParserFormatter: NgbDateParserFormatter

  ) { }

  ngOnInit() {
    //pega todos os parametros passados pela url
    this.route.params.subscribe((params) => {
      if (params.id) { this.idRecord = params.id; }
      this.isInsert = true ? params.isInsert : true;
      this.isEdit = true ? params.isEdit : true;
      this.isView = true ? params.isView : true;

    });

    //Se for view ou edit, busca os dados do Lacador e de todos os Clubes
    if (!this.isInsert) {
      //Edit ou View
      this.lacadoresService.getLacadorById(this.idRecord).subscribe((result) => {
        this.Lacador = result;
        //pega a data no formato do banco de dados e monta o array do componente Datepicker
        if (this.Lacador.dataAssociacao){
          this.Lacador.arrayDataAssociacao = this.ngbDateParserFormatter.parse(this.Lacador.dataAssociacao);
        }
        console.log('this.Lacador');
        console.log(this.Lacador);
        // console.log('this.Lacador.idClube');
        // console.log(this.Lacador.idClube);
        if (this.isEdit) {
          this.clubesdelacoService.getClubesdelaco().subscribe((clubesdelaco) => {
            this.Clubedelaco = clubesdelaco;
            console.log('Edit: clubesdelaco');
            console.log(clubesdelaco);
          });
        } else {
          this.clubesdelacoService.getClubedelacoById(this.Lacador.idClube).subscribe((clubeDoLacador) => {
            this.Clubedelaco = clubeDoLacador;
            //Se não encontrou um clube, significa que ele foi removido do sistema. Então se torna um Laçador Independente
            this.Lacador.nameClube = clubeDoLacador ? clubeDoLacador['name'] : "Laçador Independente (Clube removido do sistema)";
            console.log('View: clubeDoLacador');
            console.log(clubeDoLacador);
            //console.log(this.Lacador.nameClube);
          })
        }
      })

    } else {
      //Insert
      this.Lacador.name = null;
      this.Lacador.cpf = null;
      this.Lacador.endereco = null;
      this.Lacador.email = null;
      this.Lacador.picture = null;
      this.Lacador.status = null;
      this.Lacador.apelido = null;
      this.Lacador.foneDDD1 = null;
      this.Lacador.fone1 = null;
      this.Lacador.foneDDD2 = null;
      this.Lacador.fone2 = null;
      this.Lacador.dataAssociacao = null;

      if (!this.requestIdClube) {
        // permite selecionar um clube
        this.Lacador.idClube = null;
        this.Lacador.flgIndepentente = null;
        this.clubesdelacoService.getClubesdelaco().subscribe((clubesdelaco) => {
          this.Clubedelaco = clubesdelaco;
          console.log('this.Clubedelaco');
          console.log(this.Clubedelaco);
        })
      } else {
        //aqui a tela foi chamada para inserção em um clube específico
        this.Lacador.idClube = this.requestIdClube;
        this.clubesdelacoService.getClubedelacoById(this.idRecord).subscribe((result) => {
          this.Clubedelaco = result;
        })
      }
    }
    console.log(this.Lacador);
  }

  onEditRequest(idLacador) {
    this.router.navigate(['/lacadoresView', { id: idLacador, isEdit: true }]);
  }

  onUploadPicture() {
    let fileBrowser = this.fileInput.nativeElement;
    if (fileBrowser.files && fileBrowser.files[0]) {
      const formData = new FormData();
      formData.append("image", fileBrowser.files[0]);
      // this.projectService.upload(formData, this.project.id).subscribe(res => {
      //   // do stuff w/my uploaded file
      // });
    }
  }

  //toca todos os campos do form, para ativar a validação
  private markFormGroupTouched(formGroup: FormGroup) {
      (<any>Object).values(formGroup.controls).forEach(control => {
        control.markAsTouched();

        if (control.controls) {
          control.controls.forEach(c => this.markFormGroupTouched(c));
        }
      });
    }

  onLacadoresSubmit(lacadorForm: FormGroup) {
    //toca todos os campos do form, para ativar a validação
    this.markFormGroupTouched(lacadorForm);
    if (!lacadorForm.valid) {
        console.log("Form com erros!");
    } else {
      //Monta a data de fundação no formato para o banco de dados.
      this.Lacador.dataAssociacao = new Date(this.Lacador.arrayDataAssociacao.year, this.Lacador.arrayDataAssociacao.month - 1, this.Lacador.arrayDataAssociacao.day);
      const newLacador = {
        name: this.Lacador.name,
        cpf: this.Lacador.cpf,
        endereco: this.Lacador.endereco,
        email: this.Lacador.email,
        picture: this.Lacador.picture,
        idClube: this.Lacador.idClube,
        status: true, //this.Federacao.status,
        apelido: this.Lacador.apelido,
        foneDDD1: this.Lacador.foneDDD1,
        fone1: this.Lacador.fone1,
        foneDDD2: this.Lacador.foneDDD2,
        fone2: this.Lacador.fone2,
        dataAssociacao: this.Lacador.dataAssociacao

      }
      //console.log(newLacador);
      //console.log('newLacador');

      // Required Fields
      //  if(!this.validateService.validateFederacao(federacao)){
      //    this.flashMessage.show('Para continuar é necessário preencher todos os campos', {cssClass:'alert-danger', timeout:3000});
      //    return false;
      //  }
      //
      //   // Validar o email
      //   if(!this.validateService.validateEmail(user.email)){
      //     this.flashMessage.show('Para continuar é necessário informar um e-mail válido', {cssClass:'alert-danger', timeout:3000});
      //     return false;
      //   }
      //

      console.log('newLacador');
      console.log(newLacador);

      if (this.isInsert) {
        this.lacadoresService.addLacador(newLacador).subscribe(data => {
          if (data.success) {
            //console.log(data);
            this.router.navigate(['lacadoresView', { id: data.id, isView: true }]);
            //TODO: Mensagem
            //this.flashMessage.show('Laçador registrado com sucesso.', { cssClass: 'alert-success', timeout: 3000 });
          } else {
            //TODO: Mensagem
            //this.flashMessage.show('Ocorreu um erro ao tentar inserir este Laçador. Favor entre em contato com o suporte técnico do sistema.', { cssClass: 'alert-danger', timeout: 3000 });
          }
        })
      } else {
        //isEdit
        this.lacadoresService.updateLacador(this.Lacador).subscribe(data => {
          if (data.success) {
            console.log(data);
            //this.router.navigate(['lacadoresView', { id: this.Lacador._id, isEdit: true }]);
            //TODO: Mensagem
            //this.flashMessage.show('Laçador atualizado com sucesso.', { cssClass: 'alert-success', timeout: 5000 });
            window.scrollTo(0, 0);
          } else {
            //TODO: Mensagem
            //this.flashMessage.show('Ocorreu um erro ao tentar atualizar o registro. Favor entre em contato com o suporte técnico do sistema.' + data.msg, { cssClass: 'alert-danger', timeout: 5000 });
            window.scrollTo(0, 0);
          }
        })
      }
    }
  }
}
<file_sep>/models/usergroup.js
const mongoose = require('mongoose');
const bcrypt = require('bcryptjs');
const config = require('../config/database');

const UsergroupSchema = mongoose.Schema
({
  name: { type: String, required: true }
  situacao: { type: Boolean, required: true }
});

const Usergroup = module.exports = mongoose.model('Usergroup', UsergroupSchema);

// Get
module.exports.getUsergroupList = function(all, callback) {
  Usergroup.find(all, callback);
}


module.exports.getUsergroupById = function(id, callback) {
  const query = {
    _id: id
  }
  Usergroup.findOne(query, callback);
  console.log('callback');
  console.log(callback);
}

// Add
module.exports.addUsergroup = function(newUsergroup, callback) {
  newUsergroup.save(callback);
};

//remove

module.exports.removeUsergroup = function(idUsergroup, callback) {
  const query = {
    _id: idUsergroup
  }
  Usergroup.remove(query, callback);
}

//update
module.exports.updateById = function(usergroup, callback) {
  const query = {
    _id: usergroup._id
  };
  const newSet = {
    $set: {
      "name": usergroup.name,
      "situacao": usergroup.situacao
    }
  };

   console.log('usergroup');
   console.log(usergroup);
   console.log('newSet');
   console.log(newSet);
  Usergroup.updateOne(query, newSet, callback);

}
<file_sep>/angular-src/src/app/theme/pages/default/services/user.service.ts
import { Injectable } from '@angular/core';
import { AuthService } from '../services/auth.service';
import { Http, Headers } from '@angular/http';
import 'rxjs/add/operator/map';
import { Observable } from 'rxjs/Observable';

@Injectable()
export class UserService {
  user: any;
  constructor(
    private authService: AuthService,
    private http: Http
  ) { }

  getUsers() {
    let headers = new Headers();
    //headers.append('Authorization', this.authService.authToken);
    headers.append('Content-Type', 'application/json');
    let ep = this.authService.prepEndpoint('user/list');
    //console.log('service - getuseres()');
    return this.http.get(ep, { headers: headers })
      .map(res => res.json())
      .map(res => res['userList']) as Observable<any[]>;;
  }

  getUserById(idUser) {
    let headers = new Headers();
    //headers.append('Authorization', this.authService.authToken);
    headers.append('Content-Type', 'application/json');
    let ep = this.authService.prepEndpoint('user/view');
    //console.log('service - getuseres()');
    return this.http.get(ep, { headers: headers, params: { idUser: idUser } })
      .map(res => res.json())
      .map(res => res['user']) as Observable<any[]>;;;
  }

  getUserByUsername(idClube) {
    let headers = new Headers();
    //headers.append('Authorization', this.authService.authToken);
    headers.append('Content-Type', 'application/json');
    let ep = this.authService.prepEndpoint('user/viewByUsername');

    return this.http.get(ep, { headers: headers, params: { idClube: idClube } })
      .map(res => res.json())
      .map(res => res['userList']) as Observable<any[]>;
  }

  addUser(user) {
    //return new Promise(resolve => resolve(user));
    console.log('passou aqui');
    console.log(user);
    let headers = new Headers();
    //headers.append('Authorization', this.authService.authToken);
    headers.append('Content-Type', 'application/json');
    let ep = this.authService.prepEndpoint('user/add');
    return this.http.post(ep, user, { headers: headers })
      .map(res => res.json());
  }

  removeUser(idUser) {
    //console.log(2);
    let headers = new Headers();
    //headers.append('Authorization', this.authService.authToken);
    headers.append('Content-Type', 'application/json');
    let ep = this.authService.prepEndpoint('user/remove');
    //console.log(3);
    return this.http.post(ep, { idUser: idUser }, { headers: headers })
      .map(res => res.json());
  }

  updateUser(user) {
    //console.log(2);
    let headers = new Headers();
    //headers.append('Authorization', this.authService.authToken);
    headers.append('Content-Type', 'application/json');
    let ep = this.authService.prepEndpoint('user/update');
    return this.http.post(ep, user, { headers: headers })
      .map(res => res.json());
  }

  // setUserIndependenteByClube(idClubedelaco) {
  //   //console.log(2);
  //   let headers = new Headers();
  //   //headers.append('Authorization', this.authService.authToken);
  //   headers.append('Content-Type', 'application/json');
  //   let ep = this.authService.prepEndpoint('user/setUserIndependenteByClube');
  //   return this.http.post(ep, { idClubedelaco: idClubedelaco }, { headers: headers })
  //     .map(res => res.json());
  // }


}
<file_sep>/angular-src/src/app/services/federacao.service.ts
import { Injectable } from '@angular/core';
import { AuthService } from '../services/auth.service';
import { Http, Headers } from '@angular/http';
import 'rxjs/add/operator/map';

// let federacoes = [
//   { title: 'Federação 1', isActive: true },
//   { title: 'Federação 2', isActive: true },
//   { title: 'Federação 3', isActive: false },
//   { title: 'Federação 4', isActive: false },
// ];

@Injectable()
export class FederacaoService {
  federacao: any;
  constructor(
    private authService: AuthService,
    private http: Http
  ) { }

  getFederacoes() {
    let headers = new Headers();
    //headers.append('Authorization', this.authService.authToken);
    headers.append('Content-Type', 'application/json');
    let ep = this.authService.prepEndpoint('federacao/list');
    //console.log('service - getFederacoes()');
    return this.http.get(ep, { headers: headers })
      .map(res => res.json());
  }

  getFederacaoById(idFederacao) {
    let headers = new Headers();
    //headers.append('Authorization', this.authService.authToken);
    headers.append('Content-Type', 'application/json');
    let ep = this.authService.prepEndpoint('federacao/view');
    //console.log('service - getFederacoes()');
    return this.http.get(ep, { headers: headers, params: { idFederacao: idFederacao } })
      .map(res => res.json());
  }

  addFederacao(federacao) {
    //return new Promise(resolve => resolve(federacoes));
    //console.log('passou aqui');
    let headers = new Headers();
    //headers.append('Authorization', this.authService.authToken);
    headers.append('Content-Type', 'application/json');
    let ep = this.authService.prepEndpoint('federacao/add');
    return this.http.post(ep, federacao, { headers: headers })
      .map(res => res.json());
  }

  removeFederacao(idFederacao) {
    //console.log(2);
    let headers = new Headers();
    //headers.append('Authorization', this.authService.authToken);
    headers.append('Content-Type', 'application/json');
    let ep = this.authService.prepEndpoint('federacao/remove');
    //console.log(3);
    return this.http.post(ep, { idFederacao: idFederacao }, { headers: headers })
      .map(res => res.json());
  }

  updateFederacao(federacao) {
    //console.log(2);
    let headers = new Headers();
    //headers.append('Authorization', this.authService.authToken);
    headers.append('Content-Type', 'application/json');
    let ep = this.authService.prepEndpoint('federacao/update');
    return this.http.post(ep, federacao, { headers: headers })
      .map(res => res.json());
  }
}
<file_sep>/angular-src/src/app/theme/pages/default/services/clubesdelaco.service.spec.ts
import { TestBed, inject } from '@angular/core/testing';

import { ClubesdelacoService } from './clubesdelaco.service';

describe('ClubesdelacoService', () => {
  beforeEach(() => {
    TestBed.configureTestingModule({
      providers: [ClubesdelacoService]
    });
  });

  it('should be created', inject([ClubesdelacoService], (service: ClubesdelacoService) => {
    expect(service).toBeTruthy();
  }));
});
<file_sep>/routes/pages.js
const express = require('express');
const router = express.Router();
const passport = require('passport');
const jwt = require('jsonwebtoken');
const config = require('../config/database');
const Page = require('../models/page');


// List
router.get('/list', (req, res, next) => {
  Page.getPageList({}, (err, pageList) => {
    if (err) throw err;
    if (!pageList) {
      return res.json({
        success: false,
        msg: 'Tabela vazia'
      });
    } else {
      return res.json({ pageList: pageList });
    }
  })
});


router.get('/listByUserGroupId', (req, res, next) => {
  Page.getPageByUserGroupId(req.query.idUserGroup, (err, pageList) => {
    if (err) throw err;
    if (!pageList) {
      return res.json({
        success: false,
        msg: 'Tabela vazia'
      });
    } else {
      // console.log('pageList');
      // console.log(pageList);
      return res.json({ pageList });
    }
  })
});

// View
router.get('/view', (req, res, next) => {
  //console.log('req.params.idPage');
  //console.log(req.query.idPage);
  Page.getPageById(req.query.idPage, (err, page) => {
    if (!page) {
      return res.json({
        success: false,
        msg: 'Erro ao buscar o registro da Página desejada. Entre em contato com o suporte técnico do sistema.'
      });
    } else {
      //console.log('Page(routes)');
      //console.log(page);
      res.json({
        page: page
      });
    }
  })
});

// Edit
router.post('/update', (req, res, next) => {
   console.log('chegou aqui');
   console.log('req.body');
   console.log(req.body);
  Page.updateById(req.body, (err, callback) => {

    if (err) {
      console.log(err);
      res.json({
        success: false,
        msg: "Erro ao atualizar o registro da Página:",
        erro: err
      });
    } else {
      res.json({
        success: true,
        msg: "Página atualizada com sucesso."
      });
    }
  });
});


// Delete
router.post('/remove', (req, res, next) => {
  Page.removePage(req.body.idPage, (err, callback) => {
    if (err) {
      console.log(err);
      res.json({
        success: false,
        msg: "Erro ao remover o registro da Página."
      });
    } else {
      res.json({
        success: true,
        msg: "Página removida do sistema com sucesso."
      });
    }
  });
});


//Register
router.post('/add', (req, res, next) => {
  let newPage = new Page({
    url: req.body.url,
    title: req.body.title,
    security: req.body.security ? true : null
  })

  Page.addPage(newPage, (err, page) => {
    if (err) {
      console.log(err);
      res.json({
        success: false,
        msg: "Erro ao adicionar o registro de nova Página."
      });
    } else {
      res.json({
        success: true,
        msg: "Página adicionada com sucesso.",
        id: page._id
      });
    }
  });

});
module.exports = router;
<file_sep>/angular-src/src/app/theme/pages/default/components/federacao/federacao-add/federacao-add.component.spec.ts
import { async, ComponentFixture, TestBed } from '@angular/core/testing';

import { FederacaoAddComponent } from './federacao-add.component';

describe('FederacaoAddComponent', () => {
  let component: FederacaoAddComponent;
  let fixture: ComponentFixture<FederacaoAddComponent>;

  beforeEach(async(() => {
    TestBed.configureTestingModule({
      declarations: [FederacaoAddComponent]
    })
      .compileComponents();
  }));

  beforeEach(() => {
    fixture = TestBed.createComponent(FederacaoAddComponent);
    component = fixture.componentInstance;
    fixture.detectChanges();
  });

  it('should be created', () => {
    expect(component).toBeTruthy();
  });
});
<file_sep>/angular-src/src/app/theme/pages/default/components/users/usersView/usersView.component.ts
import { Component, OnInit, Input, ViewChild } from '@angular/core';
// import { appOutputMessages } from '../../../../../../shared/appmessages';
import { UserService } from '../../../services/user.service';
import { FormGroup,FormControl, Validators, ReactiveFormsModule  } from '@angular/forms';
import { ClubesdelacoService } from '../../../services/clubesdelaco.service';
//Depreciado
//import { ValidateService } from '../../../services/validate.service';
import { Router } from '@angular/router';
import { ActivatedRoute } from '@angular/router';


const now = new Date();

@Component({
  selector: '.m-grid__item.m-grid__item--fluid.m-wrapper',
  templateUrl: './usersView.component.html',
  styleUrls: ['./usersView.component.css']
})
export class UsersViewComponent implements OnInit {
  @ViewChild('pictureInput') fileInput;
  User: any = {
    _id: String,
    name: String,
    email: String,
    username: String,
    password: <PASSWORD>,
    status: Boolean,
    picture: Blob,
    cpf: String,
    foneDDD1: String,
    fone1: String,
    dataCadastro: Date
  };
  isView: boolean;
  isInsert: boolean;
  isEdit: boolean;
  idRecord: any;
  //userForm: FormGroup;

  constructor(
    //Depreciado
    //private validateService: ValidateService,


    private router: Router,
    private route: ActivatedRoute,
    private usersService: UserService,


  ) { }

  ngOnInit() {

    //pega todos os parametros passados pela url
    this.route.params.subscribe((params) => {
      if (params.id) { this.idRecord = params.id; }
      this.isInsert = true ? params.isInsert : true;
      this.isEdit = true ? params.isEdit : true;
      this.isView = true ? params.isView : true;

    });

    console.log('this.User');
    console.log(this.User);

    //Se for view ou edit, busca os dados do Usuário e de todos os Clubes
    if (!this.isInsert) {
      //Edit ou View
      this.usersService.getUserById(this.idRecord).subscribe((result) => {
        this.User = result;
        //pega a data no formato do banco de dados e monta o array do componente Datepicker
        // if (this.User.dataCadastro){
        //   this.User.arrayDataAssociacao = this.ngbDateParserFormatter.parse(this.User.dataAssociacao);
        // }
        console.log('this.User');
        console.log(this.User);
        // console.log('this.Lacador.idClube');
        // console.log(this.Lacador.idClube);
      })

    } else {
      //Insert
      this.User.name = null;
      this.User.email = null;
      this.User.username = null;
      this.User.password = <PASSWORD>;
      this.User.status = null;
      this.User.picture = null;
      this.User.cpf = null;
      this.User.foneDDD1 = null;
      this.User.fone1 = null;
      //this.User.dataAssociacao = now.getDate();
    }
    console.log(this.User);
  }

  onEditRequest(idUser) {
    this.router.navigate(['/usersView', { id: idUser, isEdit: true }]);
  }

  onUploadPicture() {
    let fileBrowser = this.fileInput.nativeElement;
    if (fileBrowser.files && fileBrowser.files[0]) {
      const formData = new FormData();
      formData.append("image", fileBrowser.files[0]);
      // this.projectService.upload(formData, this.project.id).subscribe(res => {
      //   // do stuff w/my uploaded file
      // });
    }
  }

  private markFormGroupTouched(formGroup: FormGroup) {
      (<any>Object).values(formGroup.controls).forEach(control => {
        control.markAsTouched();

        if (control.controls) {
          control.controls.forEach(c => this.markFormGroupTouched(c));
        }
      });
    }

  // validateAllFormFields(formGroup: any) {         //{1}
  //   Object.keys(formGroup.controls).forEach(field => {  //{2}
  //     const control = formGroup.get(field);             //{3}
  //     if (control instanceof FormControl) {             //{4}
  //       control.markAsTouched({ onlySelf: true });
  //     } else if (control instanceof FormGroup) {        //{5}
  //       this.validateAllFormFields(control);            //{6}
  //     }
  //   });
  // }

  onUsersSubmit(userForm: FormGroup) {
    this.markFormGroupTouched(userForm);
    if (!userForm.valid) {
        console.log("Form com erros!");
    } else {
    //Monta a data de fundação no formato para o banco de dados.
    //this.User.dataCadastro = new Date(this.User.arrayDataAssociacao.year, this.User.arrayDataAssociacao.month - 1, this.User.arrayDataAssociacao.day);
      const newUser = {
        name: this.User.name,
        email: this.User.email,
        username: this.User.username,
        password: <PASSWORD>,
        //TODO: Campo status em tela
        status: true,
        picture: this.User.picture,
        cpf: this.User.cpf,
        foneDDD1: this.User.foneDDD1,
        fone1: this.User.fone1,
        dataCadastro: this.User.dataCadastro

      }
      //console.log(newLacador);
      //console.log('newLacador');

      // Required Fields
      //  if(!this.validateService.validateFederacao(federacao)){
      //    this.flashMessage.show('Para continuar é necessário preencher todos os campos', {cssClass:'alert-danger', timeout:3000});
      //    return false;
      //  }
      //
      //   // Validar o email
      //   if(!this.validateService.validateEmail(user.email)){
      //     this.flashMessage.show('Para continuar é necessário informar um e-mail válido', {cssClass:'alert-danger', timeout:3000});
      //     return false;
      //   }
      //

      console.log('newUser');
      console.log(newUser);

      if (this.isInsert) {
        this.usersService.addUser(newUser).subscribe(data => {
          if (data.success) {
            console.log(data);
            //TODO: Mensagem
            alert('Usuário registrado com sucesso.');
          } else {
            //TODO: Mensagem
            alert('Ocorreu um erro ao tentar inserir este Laçador. Favor entre em contato com o suporte técnico do sistema.' + data.msg);
          }
          this.router.navigate(['usersView', { id: data.id, isView: true }]);
        })
      } else {
        //isEdit
        this.usersService.updateUser(this.User).subscribe(data => {
          if (data.success) {
            console.log(data);
            //TODO: Mensagem
            alert('Usuário atualizado com sucesso.');
            window.scrollTo(0, 0);
          } else {
            //TODO: Mensagem
            alert('Ocorreu um erro ao tentar atualizar o registro. Favor entre em contato com o suporte técnico do sistema.');
            window.scrollTo(0, 0);
          }
        })
      }
    }
  }
}
<file_sep>/angular-src/src/app/classes/clube-de-laco.ts
export class ClubeDeLaco {
}
<file_sep>/angular-src/src/app/theme/pages/default/components/federacao/federacao.module.ts
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { Routes, RouterModule } from '@angular/router';
import { LayoutModule } from '../../../../layouts/layout.module';
import { DefaultComponent } from '../../default.component';
//import { AuthGuard } from '../../guards/auth.guard';
import { AuthService } from '../../services/auth.service';
import { FederacaoService } from '../../services/federacao.service';
import { ClubesdelacoService } from '../../services/clubesdelaco.service';
import { LacadoresService } from '../../services/lacadores.service';
import { FederacaoComponent } from './federacao.component';

//import { SharedModule, SharedLacadoresComponent } from '../../components/sharedModule.module';

const routes: Routes = [
  {
    "path": "",
    "component": DefaultComponent,
    "children": [
      {
        "path": "",
        "component": FederacaoComponent
      }
    ]
  }
];
@NgModule({
imports: [
    CommonModule, RouterModule.forChild(routes), LayoutModule
  ], providers: [
    FederacaoService,
    AuthService,
    ClubesdelacoService,
    LacadoresService,
  ], exports: [
    //RouterModule,
    FederacaoComponent
  ], declarations: [
    FederacaoComponent
  ]
})
export class federacaoModule {



}
<file_sep>/angular-src/src/app/theme/pages/default/components/federacao/federacaoView/federacaoView.module.ts
import { NgModule } from '@angular/core';
//import { BrowserModule } from '@angular/platform-browser';
import { FormsModule } from '@angular/forms';
import { CommonModule } from '@angular/common';
import { Routes, RouterModule } from '@angular/router';
import { LayoutModule } from '../../../../../layouts/layout.module';
import { DefaultComponent } from '../../../default.component';
import { FederacaoViewComponent } from './federacaoView.component';
import {  Validators, ReactiveFormsModule  } from '@angular/forms';
//import { AuthGuard } from '../../guards/auth.guard';
import { AuthService } from '../../../services/auth.service';
//import { FederacaoService } from '../../../services/federacao.service';
import { ClubesdelacoService } from '../../../services/clubesdelaco.service';
import { LacadoresService } from '../../../services/lacadores.service';
import { FederacaoService } from '../../../services/federacao.service';
import { NgbModule, NgbDateParserFormatter } from '@ng-bootstrap/ng-bootstrap';
import { MyNgbDateParserFormatter } from '../../../../../../classes/myNgbDateParserFormatter';
import { DatepickerConfigComponent } from '../../datepicker-config/datepicker-config.component';

//import { SharedModule } from '../../../components/sharedModule.module';

const routes: Routes = [
  {
    "path": "",
    "component": DefaultComponent,
    "children": [
      {
        "path": "",
        "component": FederacaoViewComponent
      }
    ]
  }
];
@NgModule({
imports: [
  //  BrowserModule,
    FormsModule,
    CommonModule,
    RouterModule.forChild(routes),
    LayoutModule,
    NgbModule.forRoot()
  ], providers: [
    //FederacaoService,
    AuthService,
    ClubesdelacoService,
    LacadoresService,
    FederacaoService,
    { provide: NgbDateParserFormatter, useClass: MyNgbDateParserFormatter },
    ReactiveFormsModule,
    Validators
  ], exports: [
    RouterModule
  ], declarations: [
    FederacaoViewComponent,
    DatepickerConfigComponent
  ]
})
export class federacaoViewModule {

}
<file_sep>/angular-src/src/app/theme/pages/default/components/clubesdelaco/clubesdelacoView/clubesdelacoView.component.ts
import { Component, OnInit, ViewEncapsulation } from '@angular/core';
import { FederacaoService } from '../../../services/federacao.service';
import { LacadoresService } from '../../../services/lacadores.service';
import { ClubesdelacoService } from '../../../services/clubesdelaco.service';
import { LacadoresModule } from '../../lacadores/lacadores.module';
// Depreciado
// import { ValidateService } from '../../../services/validate.service';
import { FlashMessagesService } from 'angular2-flash-messages';
import { Router } from '@angular/router';
import { ActivatedRoute } from '@angular/router';
import { NgbDateStruct, NgbDateParserFormatter } from '@ng-bootstrap/ng-bootstrap';
//import { ScriptLoaderService } from '../../../../../../_services/script-loader.service';
//import { MyNgbDateParserFormatter } from '../../../classes/myNgbDateParserFormatter'
import { FormGroup,FormControl, Validators, ReactiveFormsModule  } from '@angular/forms';


@Component({
  selector: '.m-grid__item.m-grid__item--fluid.m-wrapper',  //'app-clubesdelacoView',
  templateUrl: './clubesdelacoView.component.html',
   encapsulation: ViewEncapsulation.None,
  //styleUrls: ['./clubesdelacoView.component.css']
})
export class ClubesdelacoViewComponent implements OnInit {
  Clubedelaco: any = {
    name: String,
    email: String,
    sede: String,
    status: Boolean,
    razaoSocial: String,
    cnpj: String,
    sigla: String,
    dataFundacao: String,
    registroSETEL: String,
    rua: String,
    numeroSala: String,
    bairro: String,
    cep: String,
    cidade: String,
    foneDDD: String,
    fone: String,
    faxDDD: String,
    fax: String,
    nomeRepresentante: String,
    cpfRepresentante: String,
    rgRepresentante: String,
    cargoRepresentante: String,
    foneDDDRepresentante: String,
    foneRepresentante: String,
    atuacao: String
  };

  qtdLacadores: number;
  public listLacadores : any[] ;


  isView: boolean;
  isInsert: boolean;
  isEdit: boolean;
  idRecord: any;


  constructor(
    //Depreciado
    //private validateService: ValidateService,
    private flashMessage: FlashMessagesService,
    private lacadoresService: LacadoresService,
    private federacaoService: FederacaoService,
    private router: Router,
    private route: ActivatedRoute,
    private clubesdelacoService: ClubesdelacoService,
    private ngbDateParserFormatter: NgbDateParserFormatter,
    //private _script: ScriptLoaderService
  ) { }

  ngOnInit() {

    this.Clubedelaco.name = '';
    this.Clubedelaco.sede = '';
    this.Clubedelaco.email = '';
    this.Clubedelaco.status = '';
    this.Clubedelaco.razaoSocial = '';
    this.Clubedelaco.cnpj = '';
    this.Clubedelaco.sigla = '';
    this.Clubedelaco.dataFundacao = '';
    this.Clubedelaco.registroSETEL = '';
    this.Clubedelaco.rua = '';
    this.Clubedelaco.numeroSala = '';
    this.Clubedelaco.bairro = '';
    this.Clubedelaco.cep = '';
    this.Clubedelaco.cidade = '';
    this.Clubedelaco.foneDDD = '';
    this.Clubedelaco.fone = '';
    this.Clubedelaco.faxDDD = '';
    this.Clubedelaco.fax = '';
    this.Clubedelaco.nomeRepresentante = '';
    this.Clubedelaco.cpfRepresentante = '';
    this.Clubedelaco.rgRepresentante = '';
    this.Clubedelaco.cargoRepresentante = '';
    this.Clubedelaco.foneDDDRepresentante = '';
    this.Clubedelaco.foneRepresentante = '';
    this.Clubedelaco.atuacao = '';

    this.route.params.subscribe((params) => {
      if (params.id) { this.idRecord = params.id; }
      this.isInsert = true ? params.isInsert : true;
      this.isEdit = true ? params.isEdit : true;
      this.isView = true ? params.isView : true;

    });

    if (!this.isInsert) {
      //BUSCA INFOS DO CLUBE
      this.clubesdelacoService.getClubedelacoById(this.idRecord).subscribe((result) => {
        this.Clubedelaco = result;
        //pega a data no formato do banco de dados e monta o array do componente Datepicker
        this.Clubedelaco.arrayDataFundacao = this.ngbDateParserFormatter.parse(this.Clubedelaco.dataFundacao);
      })
      //BUSCA OS LACADORES DO clube
      this.lacadoresService.getLacadorByClubeId(this.idRecord).subscribe(result => {
          //this.qtdLacadoresRegistrados = result.length;
          this.listLacadores = result;
          console.log('this.listLacadores');
          console.log(this.listLacadores);
          this.qtdLacadores = result.length;
      })

    }
  }

  onEditRequest(idClubedelaco) {
    console.log('idClubedelaco');
    console.log(idClubedelaco);
    this.router.navigate(['/clubesdelacoView', { id: idClubedelaco, isEdit: true }]);
  }


  private markFormGroupTouched(formGroup: FormGroup) {
      (<any>Object).values(formGroup.controls).forEach(control => {
        control.markAsTouched();

        if (control.controls) {
          control.controls.forEach(c => this.markFormGroupTouched(c));
        }
      });
    }

  onClubesdelacoSubmit(clubesdelacoForm: FormGroup) {
    this.markFormGroupTouched(clubesdelacoForm);
    if (!clubesdelacoForm.valid) {
        console.log("Form com erros!");
    } else {
      //Monta a data de fundação no formato para o banco de dados.
      if (this.Clubedelaco.arrayDataFundacao) {
        this.Clubedelaco.dataFundacao = new Date(this.Clubedelaco.arrayDataFundacao.year, this.Clubedelaco.arrayDataFundacao.month - 1, this.Clubedelaco.arrayDataFundacao.day);
      } else {
        this.Clubedelaco.dataFundacao = null
      }

      // Required Fields
      //  if(!this.validateService.validateFederacao(federacao)){
      //    this.flashMessage.show('Para continuar é necessário preencher todos os campos', {cssClass:'alert-danger', timeout:3000});
      //    return false;
      //  }
      //
      //   // Validar o email
      //   if(!this.validateService.validateEmail(user.email)){
      //     this.flashMessage.show('Para continuar é necessário informar um e-mail válido', {cssClass:'alert-danger', timeout:3000});
      //     return false;
      //   }
      //

      // Register user

      if (this.isInsert) {
        const newClubedelaco = {
          name: this.Clubedelaco.name,
          sede: this.Clubedelaco.sede,
          email: this.Clubedelaco.email,
          status: true, //this.Federacao.status,
          razaoSocial: this.Clubedelaco.razaoSocial,
          cnpj: this.Clubedelaco.cnpj,
          sigla: this.Clubedelaco.sigla,
          dataFundacao: this.Clubedelaco.dataFundacao,
          registroSETEL: this.Clubedelaco.registroSETEL,
          rua: this.Clubedelaco.rua,
          numeroSala: this.Clubedelaco.numeroSala,
          bairro: this.Clubedelaco.bairro,
          cep: this.Clubedelaco.cep,
          cidade: this.Clubedelaco.cidade,
          foneDDD: this.Clubedelaco.foneDDD,
          fone: this.Clubedelaco.fone,
          faxDDD: this.Clubedelaco.faxDDD,
          fax: this.Clubedelaco.fax,
          nomeRepresentante: this.Clubedelaco.nomeRepresentante,
          cpfRepresentante: this.Clubedelaco.cpfRepresentante,
          rgRepresentante: this.Clubedelaco.rgRepresentante,
          cargoRepresentante: this.Clubedelaco.cargoRepresentante,
          foneDDDRepresentante: this.Clubedelaco.foneDDDRepresentante,
          foneRepresentante: this.Clubedelaco.foneRepresentante,
          atuacao: this.Clubedelaco.atuacao
        }
        console.log('this.Clubedelaco');
        console.log(this.Clubedelaco);

        this.clubesdelacoService.addClubedelaco(newClubedelaco).subscribe(data => {
          if (data.success) {
            this.router.navigate(['clubesdelacoView', { id: data.id, isView: true }]);
            //TODO: Mensagem
            alert('Clube de Laço registrado com sucesso.');
          } else {
            //TODO: Mensagem
            alert('Ocorreu um erro ao tentar inserir este Clube de laço. Favor entre em contato com o suporte técnico do sistema.');
          }
        })
      } else {
        //isEdit
        this.clubesdelacoService.updateClubedelaco(this.Clubedelaco).subscribe(data => {
          if (data.success) {
            //TODO: Mensagem
            alert('Clube de Laço atualizado com sucesso.');
            window.scrollTo(0, 0);
            //this.router.navigate(['clubesdelacoView', { id: this.Clubedelaco._id, isEdit: true }]);

          } else {
            window.scrollTo(0, 0);
            //TODO: Mensagem
            alert('Ocorreu um erro ao tentar atualizar o registro. Favor entre em contato com o suporte técnico do sistema: ' + data.msg);
          }
        })
      }
    }
  }


}
<file_sep>/angular-src/src/app/theme/pages/default/services/pages.service.ts
import { Injectable } from '@angular/core';
import { AuthService } from '../services/auth.service';
import { Http, Headers } from '@angular/http';
import 'rxjs/add/operator/map';
import { Observable } from 'rxjs/Observable';

@Injectable()
export class PagesService {
  page: any;
  constructor(
    private authService: AuthService,
    private http: Http
  ) { }

  getPages() {
    let headers = new Headers();
    //headers.append('Authorization', this.authService.authToken);
    headers.append('Content-Type', 'application/json');
    let ep = this.authService.prepEndpoint('page/list');
    //console.log('service - getPages()');
    return this.http.get(ep, { headers: headers })
      .map(res => res.json())
      .map(res => res['pageList']) as Observable<any[]>;;
  }

  getPageById(idPage) {
    let headers = new Headers();
    //headers.append('Authorization', this.authService.authToken);
    headers.append('Content-Type', 'application/json');
    let ep = this.authService.prepEndpoint('page/view');
    //console.log('service - getPages()');
    return this.http.get(ep, { headers: headers, params: { idPage: idPage } })
      .map(res => res.json())
      .map(res => res['page']) as Observable<any[]>;;;
  }

  getPageByUserGroupId(idUserGroup) {
    let headers = new Headers();
    //headers.append('Authorization', this.authService.authToken);
    headers.append('Content-Type', 'application/json');
    let ep = this.authService.prepEndpoint('page/listByUserGroupId');

    return this.http.get(ep, { headers: headers, params: { idUserGroup: idUserGroup } })
      .map(res => res.json())
      .map(res => res['pageList']) as Observable<any[]>;
  }

  addPage(page) {
    //return new Promise(resolve => resolve(page));
    //console.log('passou aqui');
    let headers = new Headers();
    //headers.append('Authorization', this.authService.authToken);
    headers.append('Content-Type', 'application/json');
    let ep = this.authService.prepEndpoint('page/add');
    return this.http.post(ep, page, { headers: headers })
      .map(res => res.json());
  }

  removePage(idPage) {
    //console.log(2);
    let headers = new Headers();
    //headers.append('Authorization', this.authService.authToken);
    headers.append('Content-Type', 'application/json');
    let ep = this.authService.prepEndpoint('page/remove');
    //console.log(3);
    return this.http.post(ep, { idPage: idPage }, { headers: headers })
      .map(res => res.json());
  }

  updatePage(page) {
    //console.log(2);
    let headers = new Headers();
    //headers.append('Authorization', this.authService.authToken);
    headers.append('Content-Type', 'application/json');
    let ep = this.authService.prepEndpoint('page/update');
    return this.http.post(ep, page, { headers: headers })
      .map(res => res.json());
  }

}
