Commit 7e376fb8 authored by Nacim Goura's avatar Nacim Goura

global refactoring

parent 11d203aa
......@@ -8,6 +8,7 @@ Meteor.methods({
// add account
addAccount(user) {
// validate user data
check(user, Object);
new SimpleSchema({
email: {
type: String,
......
......@@ -2,10 +2,6 @@
import SimpleSchema from 'simpl-schema';
import { Mongo } from 'meteor/mongo';
if (Meteor.isClient) {
import './hooksForm';
}
SimpleSchema.extendOptions(['autoform']);
/**
......
import { check } from 'meteor/check';
import { Meteor } from 'meteor/meteor';
import configCollection from '../../collections/configCollection';
import configCollection from '/imports/api/config/configCollection';
Meteor.methods({
// define config
......
import displayNotif from './../../ui/components/notifs/notifs.js';
import { AutoForm } from 'meteor/aldeed:autoform';
import displayNotif from '/imports/ui/components/notifs/notifs.js';
export default {
const hooksFormApiCrawl = {
onSuccess(formType, result) {
displayNotif({
type: 'success',
title: 'Indexation : ',
message: `Indexation fini avec succès avec ${result.items.length} urls indexées!`,
message: `Indexation fini avec succès avec ${result.index.items.length} urls indexées!`,
save: true,
});
},
......@@ -19,3 +20,7 @@ export default {
});
},
};
AutoForm.hooks({
formApiCrawl: hooksFormApiCrawl,
});
import { Meteor } from 'meteor/meteor';
import _ from 'lodash';
import checkData from '../../utils/checkData';
import checkData from '/imports/utils/checkData';
export default class CrawlFacebook {
......
......@@ -2,7 +2,7 @@
import { Meteor } from 'meteor/meteor';
import Twitter from 'twitter';
import _ from 'lodash';
import checkData from '../../utils/checkData';
import checkData from '/imports/utils/checkData';
export default class CrawlTwitter {
......
import { AutoForm } from 'meteor/aldeed:autoform';
import displayNotif from '/imports/ui/components/notifs/notifs.js';
const hooksFormWebsiteCrawl = {
onSuccess(formType, result) {
displayNotif({
type: 'success',
title: 'Indexation : ',
message: `Indexation fini avec succès avec ${result.index.items.length} urls indexées!`,
save: true,
});
},
onError(formType, error) {
displayNotif({
type: 'error',
title: 'Indexation : ',
message: error.reason ? error.reason : error,
save: true,
});
},
};
AutoForm.hooks({
formWebsiteCrawl: hooksFormWebsiteCrawl,
});
import SimpleSchema from 'simpl-schema';
SimpleSchema.extendOptions(['autoform']);
export default new SimpleSchema({
urlWebsite: {
type: String,
label: 'Url du site ou du sitemap à indexer :',
},
}, { tracker: Tracker });
......@@ -3,7 +3,7 @@ import url from 'url';
import { Meteor } from 'meteor/meteor';
import Crawler from 'crawler';
import Sitemapper from 'sitemapper';
import checkData from '../../utils/checkData';
import checkData from '/imports/utils/checkData';
export default class crawlWebsite {
......
......@@ -2,10 +2,10 @@
import { check } from 'meteor/check';
import { Meteor } from 'meteor/meteor';
import _ from 'lodash';
import { formApiCrawlSchema } from '/imports/collections/schemaForm';
import IndexGeneric from './indexGeneric';
import IndexWebsite from './indexWebsite';
import IndexApi from './indexApi';
import formApiCrawlSchema from '/imports/api/crawl/api/formApiCrawlSchema';
import IndexGeneric from '/imports/api/indexation/server/indexGeneric';
import IndexWebsite from '/imports/api/indexation/server/indexWebsite';
import IndexApi from '/imports/api/indexation/server/indexApi';
Meteor.methods({
initIndexElastic() {
......
......@@ -87,7 +87,7 @@ exports.mapping = {
type: 'keyword',
},
domain: {
type: 'keyword'
type: 'keyword',
},
title: {
type: 'text',
......
import CrawlApi from '/imports/api/crawl/api/server/crawlApi';
import IndexGeneric from './indexGeneric';
import CrawlApi from '../crawl/crawlApi';
export default class IndexApi extends IndexGeneric {
async indexationApi(data) {
return new CrawlApi(data)
.then(dataToIndex => this.indexByBulk(dataToIndex))
.then(dataToIndex => new Promise(async resolve => resolve({
index: await this.indexByBulk(dataToIndex),
dataForm: {
api: data,
},
})))
.catch((error) => {
throw error;
});
......
import { Meteor } from 'meteor/meteor';
import indexationElastic from '../../libs/elasticsearch/elasticsearch';
import indexationElastic from '/imports/libs/elasticsearch/elasticsearch';
import configElastic from './elasticSearchConfig';
const esIndex = Meteor.settings.private.elasticsearch.esIndex;
......
import CrawlWebsite from '/imports/api/crawl/website/server/crawlWebsite';
import IndexGeneric from './indexGeneric';
import CrawlWebsite from '../crawl/crawlWebsite';
export default class IndexWebsite extends IndexGeneric {
......@@ -11,7 +11,12 @@ export default class IndexWebsite extends IndexGeneric {
*/
async indexationWebsite(urlWebsite) {
return new CrawlWebsite(urlWebsite)
.then(dataToIndex => this.indexByBulk(dataToIndex))
.then(dataToIndex => new Promise(async resolve => resolve({
index: await this.indexByBulk(dataToIndex),
dataForm: {
urlWebsite,
},
})))
.catch((error) => {
throw error;
});
......
import { AutoForm } from 'meteor/aldeed:autoform';
import { Meteor } from 'meteor/meteor';
import { Session } from 'meteor/session';
import { FlowRouter } from 'meteor/kadira:flow-router';
import displayNotif from './../../ui/components/notifs/notifs.js';
import displayNotif from '../../ui/components/notifs/notifs.js';
export default {
const hooksFormLogin = {
onSubmit: (insertDoc, updateDoc, currentDoc) => {
Meteor.loginWithPassword(insertDoc.login, insertDoc.password, (err) => {
if (err) {
......@@ -22,7 +24,6 @@ export default {
// get global config for user
Meteor.callPromise('getConfig', {})
.then((config) => {
console.log(config);
Session.set('config', config);
});
}
......@@ -30,3 +31,8 @@ export default {
return false;
},
};
AutoForm.hooks({
formApiCrawl: hooksFormLogin,
});
import SimpleSchema from 'simpl-schema';
SimpleSchema.extendOptions(['autoform']);
export default new SimpleSchema({
......
import SimpleSchema from 'simpl-schema';
import { Meteor } from 'meteor/meteor';
import { Mongo } from 'meteor/mongo';
/**
* this local collection keep tracks of all notification of this application
* @type {Mongo.Collection}
*/
const notifsCollection = new Mongo.Collection(null);
const notifsCollection = new Mongo.Collection('notifs');
SimpleSchema.notifsCollection = new SimpleSchema({
type: {
......@@ -23,12 +24,15 @@ SimpleSchema.notifsCollection = new SimpleSchema({
type: Date,
defaultValue: new Date(),
},
read: {
type: Boolean,
defaultValue: false,
user: {
type: String,
defaultValue: Meteor.userId(),
},
});
notifsCollection.attachSchema(SimpleSchema.notifsCollection);
// publish notif for available by client
// Meteor.publish('notifs', () => notifsCollection.find({ user: Meteor.userId() }).fetch());
export default notifsCollection;
import SimpleSchema from 'simpl-schema';
import { Meteor } from 'meteor/meteor';
import { check } from 'meteor/check';
import _ from 'lodash';
import testSearchCollection from '../../collections/testSearchCollection';
import testSearchCollection from '/imports/api/testSearch/testSearchCollection';
Meteor.methods({
addTest(test) {
......
import SimpleSchema from 'simpl-schema';
/**
* Custom error messages
*/
SimpleSchema.setDefaultMessages({
messages: {
en: {
supMax: 'Cette valeur est supérieure au maximum.',
maxInfMin: 'La valeur maximale doit être supérieure à la valeur minimale.',
startInfEnd: 'La date de début doit être inférieure à la date de fin.',
endInfStart: 'La date de fin doit être supérieure à la date de début.',
usernameExists: 'Ce login est déjà utilisé. Veuillez en choisir un autre',
noMatchingPassword: 'les champs liés au mot de passe ne correspondent pas.',
companyHasAlreadySubmittedForThisBatch: 'Cette entreprise participe déjà à une réponse pour ce lot.',
// native messages
required: 'Veuillez saisir ou sélectionner une valeur pour le champ [label]',
minString: 'Veuillez saisir au moins [min] caractères',
maxString: 'Veuillez saisir moins de [max] caractères',
minNumber: 'Ce champ doit être superieur ou égal à [min]',
maxNumber: 'Ce champ doit être inferieur ou égal à [max]',
minNumberExclusive: 'Ce champ doit être superieur à [min]',
maxNumberExclusive: 'Ce champ doit être inferieur à [max]',
minDate: 'La date doit est postérieure au [min]',
maxDate: 'La date doit est antérieure au [max]',
badDate: 'Cette date est invalide',
minCount: 'Vous devez saisir plus de [minCount] valeurs',
maxCount: 'Vous devez saisir moins de [maxCount] valeurs',
noDecimal: 'Ce champ doit être un entier',
notAllowed: "[value] n'est pas une valeur acceptée",
expectedString: 'Le champ [label] doit être une chaine de caractères',
expectedNumber: 'Le champ [label] doit être un nombre',
expectedBoolean: 'Le champ [label] doit être un booléen',
expectedArray: 'Le champ [label] doit être un tableau',
expectedObject: 'Le champ [label] doit être une objet',
expectedConstructor: 'Le champ [label] doit être du type [type]',
keyNotInSchema: "Le champ [key] n'est pas permis par le schéma",
regEx: [
{ msg: 'Le champ [label] ne vérifie pas la validation par Regex' },
{ exp: SimpleSchema.RegEx.Email, msg: 'Cette adresse e-mail est incorrecte' },
{ exp: SimpleSchema.RegEx.WeakEmail, msg: 'Cette adresse e-mail est incorrecte' },
{ exp: SimpleSchema.RegEx.Domain, msg: 'Le champ [label] doit être un domaine valide' },
{ exp: SimpleSchema.RegEx.WeakDomain, msg: 'Le champ [label] doit être un domaine valide' },
{ exp: SimpleSchema.RegEx.IP, msg: 'Cette adresse IP est invalide' },
{ exp: SimpleSchema.RegEx.IPv4, msg: 'Cette adresse IPv4 est invalide' },
{ exp: SimpleSchema.RegEx.IPv6, msg: 'Cette adresse IPv6 est invalide' },
{ exp: SimpleSchema.RegEx.Url, msg: 'Cette URL is invalide' },
{ exp: SimpleSchema.RegEx.Id, msg: 'Cet identifiant alphanumérique est invalide' },
{ exp: SimpleSchema.RegEx.Phone, msg: 'Ce numéro de téléphone est invalide' },
{ exp: SimpleSchema.RegEx.Telephone, msg: 'Ce numéro de téléphone est invalide' },
],
},
},
});
import { AutoForm } from 'meteor/aldeed:autoform';
import hooksFormApiCrawl from './hooks/hooksFormApiCrawl';
import hooksFormLogin from './hooks/hooksFormLogin';
AutoForm.hooks({
formApiCrawl: hooksFormApiCrawl,
formLogin: hooksFormLogin,
});
import formLoginSchema from './formLoginSchema';
import formApiCrawlSchema from './formApiCrawlSchema';
if (Meteor.isClient) {
import './hooksForm';
}
export { formApiCrawlSchema, formLoginSchema };
import { Meteor } from 'meteor/meteor';
import { FlowRouter } from 'meteor/kadira:flow-router';
import { BlazeLayout } from 'meteor/kadira:blaze-layout';
const adminSection = FlowRouter.group({
prefix: '/admin',
triggersEnter: [(context, redirect) => {
if (!Meteor.userId()) {
redirect('login');
}
}],
});
adminSection.route('/', {
......@@ -38,3 +44,14 @@ adminSection.route('/stat', {
});
},
});
adminSection.route('/notif', {
name: 'notif',
action() {
BlazeLayout.render('mainLayoutTpl', {
sidebar: 'sidebarLayoutTpl',
main: 'notifTpl',
navbar: 'navbarLayoutTpl',
});
},
});
......@@ -16,6 +16,7 @@ import '../../ui/pages/not-found/not-found';
import '../../ui/pages/admin/indexation/indexation';
import '../../ui/pages/admin/account/account';
import '../../ui/pages/admin/statistique/statistique';
import '../../ui/pages/admin/notif/notif';
// Set up all routes in the app
import './adminRoutes';
......
// Import server startup through a single index entry point
import './fixtures';
import './register-api';
import('meteor/percolate:synced-cron').then(({ SyncedCron }) => {
const numberCron = Object.keys(SyncedCron._entries);
if (numberCron > 0) {
console.log(`Nombre de cron à exécuter : ${numberCron}`);
SyncedCron.start();
}
});
// Register your apis here
import '../../api/indexation/methods';
import '../../api/account/methods';
import '../../api/config/methods';
import '../../api/testSearch/methods';
import '../../tabular/tabularUser';
import '../../tabular/tabularTestSearch';
// Register your apis here
import '/imports/api/indexation/methods';
import '/imports/api/account/methods';
import '/imports/api/config/methods';
import '/imports/api/testSearch/methods';
import '/imports/tabular/tabularUser';
import '/imports/tabular/tabularTestSearch';
import Tabular from 'meteor/aldeed:tabular';
import { Meteor } from 'meteor/meteor';
import testSearchCollection from '../collections/testSearchCollection';
import testSearchCollection from '../api/testSearch/testSearchCollection';
new Tabular.Table({
name: 'testSearch',
......
import iziToast from 'izitoast';
import alertsCollections from '../../../collections/alertsCollection';
import alertsCollections from '../../../api/notif/notifsCollection';
export default function (options) {
this.options = {
......
import { Template } from 'meteor/templating';
import { Session } from 'meteor/session';
import tabsCollection from '../../../collections/tabsCollection';
import tabsCollection from '../../../api/tabs/tabsCollection';
import './tabs.html';
......
......@@ -19,7 +19,7 @@
<ul class="nav navbar-nav navbar-right">
{{#if currentUser}}
<li>
<a href="#">
<a href="/admin/notif">
<i class="fa fa-bell"></i>
</a>
</li>
......@@ -27,9 +27,6 @@
<a href="/logout">Déconnexion</a>
</li>
{{else}}
<li>
<a href="/register">Inscription</a>
</li>
<li>
<a href="/login">Connexion</a>
</li>
......
......@@ -2,7 +2,7 @@
import { Meteor } from 'meteor/meteor';
import { Template } from 'meteor/templating';
import { Session } from 'meteor/session';
import TabsCollection from '../../../../collections/tabsCollection';
import TabsCollection from '../../../../api/tabs/tabsCollection';
import '../../../components/tabs/tabs';
import './list/list';
......
......@@ -17,7 +17,7 @@
</div>
{{> afQuickField name='content'}}
</fieldset>
<button type="submit" class="btn btn-primary">Insert</button>
<button type="submit" class="btn btn-success">Valider</button>
{{/autoForm}}
</div>
</div>
......
import { formApiCrawlSchema } from '/imports/collections/schemaForm';
import formApiCrawlSchema from '/imports/api/crawl/api/formApiCrawlSchema';
import { Template } from 'meteor/templating';
import $ from 'jquery';
import '/imports/api/crawl/api/formApiCrawlHooks';
import './api.html';
Template.apiIndexationTpl.onRendered(() => {
......
......@@ -2,7 +2,7 @@
import { Meteor } from 'meteor/meteor';
import { Template } from 'meteor/templating';
import { Session } from 'meteor/session';
import TabsCollection from '../../../../collections/tabsCollection';
import TabsCollection from '../../../../api/tabs/tabsCollection';
import '../../../components/tabs/tabs';
import './main/main';
......
......@@ -2,7 +2,9 @@
import { Template } from 'meteor/templating';
import { Meteor } from 'meteor/meteor';
import $ from 'jquery';
import displayNotif from '../../../../components/notifs/notifs.js';
import displayNotif from '/imports/ui/components/notifs/notifs.js';
import formWebsiteCrawlSchema from '/imports/api/crawl/website/formWebsiteCrawlSchema';
import '/imports/api/crawl/website/formWebsiteCrawlHooks';
import './site.html';
......@@ -18,8 +20,9 @@ Template.siteIndexationTpl.onRendered(() => {
$('#forbiddenWordWebsite').tagsinput('add', config.forbiddenWord);
}
$('.bootstrap-tagsinput').addClass('form-control');
}).catch((err) => {
console.log(err);
});
});
Template.siteIndexationTpl.events({
......@@ -38,12 +41,11 @@ Template.siteIndexationTpl.events({
Meteor.callPromise('indexWebsite', url)
.then((result) => {
console.log(result);
$(event.target).find('h4').addClass('hidden');
displayNotif({
type: 'success',
title: 'Indexation : ',
message: `Indexation de ${url} fini avec succès avec ${result.items.length} pages indexées!`,
message: `Indexation de ${url} fini avec succès avec ${result.index.items.length} pages indexées!`,
save: true,
});
}).catch((error) => {
......@@ -86,3 +88,9 @@ Template.siteIndexationTpl.events({
$('#forbiddenWordWebsite').tagsinput('removeAll');
},
});
Template.siteIndexationTpl.helpers({
formWebsiteCrawlSchema() {
return formWebsiteCrawlSchema;
},
});
<template name="notifTpl">
<div class="row">
<h3 class="text-center">Liste des dernières notifications</h3>
{{#if getNotifs.length}}
<ul>
{{#each getNotifs}}
<li>{{title}} - {{message}} le {{createdAt}}</li>
{{/each}}
</ul>
{{else}}
<h4 class="text-center">Aucune notification trouvé!</h4>
{{/if}}
</div>
</template>
import { Template } from 'meteor/templating';
import notifCollection from '/imports/api/notif/notifsCollection';
import './notif.html';
Template.notifTpl.helpers({
getNotifs() {
console.log(Meteor.subscribe('tasks'));
return notifCollection.find({}).fetch();
},
});
import { Meteor } from 'meteor/meteor';
import { Session } from 'meteor/session';
import { FlowRouter } from 'meteor/kadira:flow-router';
import { Template } from 'meteor/templating';
import { formLoginSchema } from '/imports/collections/schemaForm';
import { AutoForm } from 'meteor/aldeed:autoform';
import displayNotif from '../../components/notifs/notifs';
import formLoginSchema from '/imports/api/login/formLoginSchema';
import '/imports/api/login/formLoginHooks';
import './login.html';
......@@ -14,37 +10,3 @@ Template.loginTpl.helpers({
return formLoginSchema;
},
});
/* Template.loginTpl.events({
'submit form': (event) => {
event.preventDefault();
const user = {
login: event.target.login.value,
password: event.target.password.value,
};
Meteor.loginWithPassword(user.login, user.password, (err) => {
if (err) {
displayNotif({
type: 'error',
title: 'Erreur : ',
message: 'Impossible de vous connecter!',
});
} else {
FlowRouter.go('/admin');
displayNotif({
type: 'success',
title: 'Succès : ',
message: `Bienvenue ${user.login}!`,
});
// get global config for user
Meteor.callPromise('getConfig', {})
.then((config) => {
console.log(config);
Session.set('config', config);
});
}
});
},
}); */
......@@ -30,7 +30,7 @@ const checkData = {
// enleve saut de ligne et slash
let cleanStr = _.replace(str, /[\n\\/]/gm, ' ');
// met un espace avant une majuscule
//cleanStr = _.replace(cleanStr, /([A-Z])/gm, ' $1');
// cleanStr = _.replace(cleanStr, /([A-Z])/gm, ' $1');
// enleve les multiples espace
cleanStr = _.replace(cleanStr, /[^\S]{2,}/gm, ' ');
return _.trim(cleanStr);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment