Advertisement
Guest User

migration

a guest
Nov 15th, 2016
200
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.37 KB | None | 0 0
  1. #!/usr/bin/env node
  2. 'use strict';
  3.  
  4. var Steppy = require('twostep').Steppy,
  5. _= require('underscore'),
  6. db = require('../db'),
  7. mysql = require('mysql'),
  8. async = require('async'),
  9. config = require('../config')('development'),
  10. translit = require('transliteration'),
  11. generatePassword = require('password-generator'),
  12. helpers = require('../utils/helpers'),
  13. //rs = require('randomstring'),
  14. dict = require('../utils/helpers/resumeDictionaries'),
  15. striptags = require('striptags'),
  16. moment = require('moment');
  17.  
  18. var noVacancy = 0,
  19. yesVacancy = 0;
  20.  
  21. var conn = mysql.createConnection({
  22. host : 'localhost',
  23. user : 'root',
  24. password : 'root',
  25. database : 'skillbook'
  26. });
  27.  
  28.  
  29. var schedule = {
  30. 'Полный рабочий день': 'fullday_work',
  31. 'Сменный': 'shift_work',
  32. 'Неполный рабочий день': 'not_fullday_work',
  33. 'Свободный': 'free_work',
  34. 'Скользящий': 'flexible_shedule',
  35. 'Гибкий': 'flexible_shedule'
  36. }
  37.  
  38. var employment = {
  39. 'Постоянная': 'full_employment',
  40. 'Разовая': 'one_time_employment',
  41. 'Надомная': 'home_employment',
  42. 'По совместительству': 'combine_employment',
  43. 'Сезонная': 'temporary_job',
  44. 'Временная': 'temporary_job',
  45. 'Стажировки для студентов': 'traineeship'
  46. }
  47.  
  48. var experience = {
  49. 0 : 'null_experience',
  50. 1 : '1to3years',
  51. 2 : '3to5years',
  52. 3 : 'over5years'
  53. }
  54.  
  55. conn.connect();
  56.  
  57. function migrateVacancy(vacancy, organization, callback) {
  58. var newVacancy;
  59. Steppy(
  60. function() {
  61.  
  62. var s = _(dict.schedule).filter(function(sch) {
  63. return sch.sysName === schedule[vacancy.schedule]
  64. });
  65.  
  66. var e = _(dict.employment).filter(function(emp) {
  67. return emp.sysName === employment[vacancy.employment]
  68. });
  69.  
  70. var edu = _(dict.education).filter(function(level) {
  71. return level.name === vacancy.edulevel;
  72. });
  73.  
  74. var exp = _(dict.experience).filter(function(exp) {
  75. return exp.sysName === experience[vacancy.experience];
  76. });
  77.  
  78. newVacancy = {
  79. name: vacancy.position,
  80. salary: vacancy.salary,
  81. placesCount: vacancy.vaccount? vacancy.vaccount: 1,
  82. duties: striptags(vacancy.mainduties),
  83. schedule: s.length? s[0] : {},
  84. employment: e.length? e[0] : {},
  85. education: edu.length? edu[0]: {},
  86. experience: exp.length? exp[0]: {},
  87. organization: _(organization).pick('_id', 'name'),
  88. createDate: moment(vacancy.pubdate).valueOf(),
  89. updateDate: moment(vacancy.pubdate).valueOf(),
  90. isPublished: true,
  91. isDraft: false
  92. }
  93.  
  94. //console.log('vacancy.pubdate>>> ', vacancy.pubdate);
  95. var regex = new RegExp('.*' + vacancy.city + '.*');
  96. db.dictionaries.find({dictName: 'cities', fullName: regex}).toArray(this.slot());
  97. },
  98. function(err, cities) {
  99. //console.log('cities>>> ', cities);
  100. if (cities.length) {
  101. newVacancy.city = cities;
  102. }
  103. //console.log('newVacancy>>> ', newVacancy);
  104. db.vacancies.find({
  105. name: newVacancy.name,
  106. 'organization._id': organization._id
  107. }).toArray(this.slot());
  108. },
  109. function(err, vacancies) {
  110. var slot = this.slot();
  111.  
  112. if(!vacancies.length) {
  113. ++noVacancy
  114. console.log("no vacancy", noVacancy);
  115.  
  116. // console.log('insert new vacancy>>> ', newVacancy.name);
  117. db.vacancies.insertOne(newVacancy, slot)
  118. } else {
  119. // console.log('update vacancy>>> ', newVacancy.name);
  120. ++yesVacancy
  121. console.log("yes vacancy", yesVacancy);
  122. db.vacancies.updateOne(
  123. {
  124. name: newVacancy.name,
  125. 'organization._id': organization._id
  126. },
  127. {$set: newVacancy},
  128. slot
  129. )
  130. }
  131. },
  132. function(err, insertRes) {
  133. //console.log('insertRes>>> ', insertRes);
  134. callback(err, null);
  135. }
  136. )
  137. }
  138.  
  139. function migrateVacancies(organization, callback) {
  140. console.log("organization", organization);
  141. Steppy(
  142. function() {
  143.  
  144. // Здесь вакансии фильтруются по организации и здесь косяк
  145.  
  146. conn.query('select vac.position, vac.pubdate as pubdate, edu.name as edulevel, vac.salary as salary, vac.experience as experience,'
  147. ' vac.number as vaccount, vac.mainduties, sh.name as schedule, cit.name as city,'+
  148. ' emp.name as employer, empt.name as employment from modx_vacancies_vacancies as vac' +
  149. ' join modx_vacancies_employers as emp on emp.id = vac.employer_id ' + // emp.name as employer если здесь 0 то теряем вакансию
  150. ' join modx_vacancies_cities as cit on cit.id = vac.city_id ' +
  151. ' join modx_vacancies_employments as empt on empt.id = vac.employment_id ' + // empt.name as employment_id если здесь 0 то теряем вакансию
  152. ' join modx_vacancies_educationlevels as edu on edu.id = vac.educationlevel_id ' + // edu.name as edulevel если здесь 0 то теряем вакансию
  153. 'join modx_vacancies_scheduletypes as sh on sh.id = vac.scheduletype_id where vac.employer_id = ' + organization.oldId, this.slot()); // sh.name as schedule если здесь 0 то теряем вакансию
  154. },
  155. function(err, vacancies) {
  156. //console.log("query result", vacancies);
  157. console.log("wtf", vacancies.length);
  158. async.eachSeries(vacancies, function(vacancy, cb) {
  159. migrateVacancy(vacancy, organization, cb);
  160. }, this.slot())
  161. },
  162. function(err, res) {
  163. callback(err, res);
  164. }
  165. )
  166. }
  167.  
  168.  
  169. function insertOrUpdateEmployer(employer, callback) {
  170. var sysName,
  171. authUser,
  172. organization,
  173. account;
  174.  
  175. Steppy(
  176. function() {
  177. sysName = employer.name;
  178. sysName = translit.transliterate(sysName.replace(/\s/g, '_'));
  179. sysName = sysName.replace(/[^a-zA-Z_]/g, '');
  180. sysName = sysName.toLowerCase();
  181.  
  182. var newPassword = generatePassword(6, false);
  183.  
  184. var md5 = helpers.makePassword(sysName);
  185.  
  186. var sum = _.reduce(md5, function(a, b) {
  187. return ('' + a).charCodeAt(0) + ('' + b).charCodeAt(0);
  188. })
  189.  
  190. var email = sysName.substr(sysName.length - 3) + md5.substr(md5.length - 6) + sum;
  191.  
  192. email = email.toLowerCase() + '@' + (email[0] < 'n' ? 'mail.ru': 'yandex.ru');
  193.  
  194. var newPasswordHash = helpers.makePassword(newPassword);
  195.  
  196. authUser = {
  197. firstName: 'organizationFirst',
  198. lastName: 'organizationLast',
  199. middleName: 'organizationMiddle',
  200. fullName: sysName,
  201. email: email,
  202. passwordOpen: newPassword,
  203. password: newPasswordHash
  204. }
  205. organization = {
  206. name: employer.name,
  207. sysName: sysName,
  208. oldId: employer.id,
  209. approved: true
  210. }
  211.  
  212. db.authUsers.find(
  213. {
  214. email: authUser.email,
  215. firstName: 'organizationFirst'
  216. }
  217. ).toArray(this.slot())
  218. },
  219. function(err, authUsers) {
  220. var slot = this.slot();
  221.  
  222. if(!authUsers.length) {
  223. //console.log('insert authUser; ', authUser.email,
  224. //authUser.passwordOpen, organization.name, organization.sysName);
  225. db.authUsers.insertOne(authUser, slot)
  226. } else {
  227. //console.log('update authUser; ', authUser.email,
  228. //authUser.passwordOpen, organization.name, organization.sysName);
  229.  
  230. db.authUsers.updateOne(
  231. {email: authUser.email},
  232. {$set: authUser},
  233. slot
  234. )
  235. }
  236. },
  237. function(err, authUserRes) {
  238. db.organizations.find({sysName: organization.sysName}).toArray(this.slot());
  239. },
  240. function(err, organizations) {
  241. var slot = this.slot()
  242. if(!organizations.length) {
  243. //console.log('insert organization; ', organization.name, organization.sysName);
  244. db.organizations.insertOne(organization, slot)
  245. } else {
  246. //console.log('update organization; ', organization.name, organization.sysName);
  247. db.organizations.updateOne(
  248. {sysName: organization.sysName},
  249. {$set: organization},
  250. slot
  251. )
  252. }
  253. },
  254. function(err, upRes) {
  255. db.organizations.findOne({sysName: organization.sysName}, this.slot());
  256. },
  257. function(err, dborganization) {
  258. this.pass(dborganization);
  259. db.authUsers.findOne({email: authUser.email}, this.slot())
  260. },
  261. function(err, dborganization, authUser) {
  262. //console.log(dborganization);
  263. account = {
  264. role: 'employer',
  265. structures: {
  266. organization: _(dborganization).pick('_id', 'name'),
  267. },
  268. email: authUser.email,
  269. data: {},
  270. authUserId: authUser._id
  271. }
  272. db.accounts.find({authUserId: account.authUserId}).toArray(this.slot());
  273. },
  274. function(err, accounts) {
  275. var slot = this.slot();
  276.  
  277. if(!accounts.length) {
  278. //console.log('insert account>>> ', account.email);
  279. db.accounts.insertOne(account, slot)
  280. } else {
  281. //console.log('update account>>> ', account.email);
  282. db.accounts.updateOne(
  283. {authUserId: account.authUserId},
  284. {$set: account},
  285. slot
  286. )
  287. }
  288. },
  289. function(err, accRes) {
  290.  
  291. db.organizations.findOne({sysName: organization.sysName}, this.slot());
  292. },
  293. function(err, dborganization) {
  294. migrateVacancies(dborganization, this.slot());
  295. },
  296. function(err, res) {
  297. callback(err, res);
  298. }
  299. )
  300. }
  301.  
  302. Steppy(
  303. function() {
  304. db.init({config: config.mongodb}, this.slot());
  305. },
  306. function(err, connRes) {
  307. conn.query('select* from modx_vacancies_employers', this.slot());
  308. },
  309. function(err, employers) {
  310. console.log("first mysql query", employers.length);
  311.  
  312. async.eachSeries(employers, function(employer, cb) {
  313. insertOrUpdateEmployer(employer, cb);
  314. }, this.slot())
  315. },
  316. function(err, res) {
  317. if(err) {
  318. throw err;
  319. }
  320. process.exit();
  321. }
  322. )
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement