936 lines
74 KiB
JavaScript
936 lines
74 KiB
JavaScript
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.indexUsers = exports.read_fragments = exports.imageName = exports.toHTML = exports.md_edit_wrap = exports.updateUsers = exports.importUsers = exports.mergeLatestUsersTest = exports.mergeLatestUsers = exports.importUser = exports.updateUser = exports.uploadAvatar = exports.createUser = exports.getForumUsers = exports._getForumUsers = exports.getUsers = exports.getUsersPath = exports.getDataPath = exports.get_user_display_name = exports.get_user_name = exports.oa_user_email = exports.filter_accepted = exports.filter_email_missing = exports.filter_invalid = exports.filter_email_only = exports.filter_valid = exports.read_users = void 0;
|
|
const bluebird_1 = require("bluebird");
|
|
const lib_1 = require("./lib");
|
|
const utils_1 = require("@plastichub/core/utils");
|
|
const path = require("path");
|
|
const read_1 = require("@plastichub/fs/read");
|
|
const exists_1 = require("@plastichub/fs/exists");
|
|
const write_1 = require("@plastichub/fs/write");
|
|
const fs_1 = require("@plastichub/osr-commons");
|
|
const index_1 = require("../../index");
|
|
const slugify = require('slugify');
|
|
const core_1 = require("@plastichub/core");
|
|
const js_beautify_1 = require("js-beautify");
|
|
const dir_1 = require("@plastichub/fs/dir");
|
|
const osr_cli_commons_1 = require("@plastichub/osr-cli-commons");
|
|
const showdown_1 = require("showdown");
|
|
const URI = require("uri-js");
|
|
const constants_1 = require("../discourse/constants");
|
|
const filenamify = require('filenamify');
|
|
const fg = require('fast-glob');
|
|
const TEST = false;
|
|
const read_users = (src) => {
|
|
const raw = (0, read_1.sync)(src, 'json');
|
|
return raw.v3_mappins.filter((f) => f.data != null);
|
|
};
|
|
exports.read_users = read_users;
|
|
const filter_valid = (users) => {
|
|
return users.filter((user) => {
|
|
if (!user.data) {
|
|
return false;
|
|
}
|
|
if (!user.geo) {
|
|
return false;
|
|
}
|
|
if (!user.data.urls) {
|
|
return false;
|
|
}
|
|
if (!user.data.title) {
|
|
return false;
|
|
}
|
|
if (!user.detail) {
|
|
return false;
|
|
}
|
|
if (!user.detail.heroImageUrl) {
|
|
return false;
|
|
}
|
|
if (user.data && user.data.jsError) {
|
|
return false;
|
|
}
|
|
if (user.moderation !== 'accepted') {
|
|
//return false
|
|
}
|
|
return true;
|
|
});
|
|
};
|
|
exports.filter_valid = filter_valid;
|
|
const filter_email_only = (users) => {
|
|
return users.filter((user) => {
|
|
if (!user.data) {
|
|
return false;
|
|
}
|
|
if (!user.geo) {
|
|
return false;
|
|
}
|
|
if (!user.data.urls) {
|
|
return false;
|
|
}
|
|
if (user.data && user.data.jsError) {
|
|
return false;
|
|
}
|
|
if (!user.detail) {
|
|
return false;
|
|
}
|
|
if (!user.detail.name) {
|
|
return false;
|
|
}
|
|
if (user.data.urls.find((l) => l.name == 'Email') == undefined) {
|
|
return false;
|
|
}
|
|
return true;
|
|
});
|
|
};
|
|
exports.filter_email_only = filter_email_only;
|
|
const filter_invalid = (users) => {
|
|
return users.filter((user) => {
|
|
if (!user.data) {
|
|
return false;
|
|
}
|
|
if (!user.geo) {
|
|
return false;
|
|
}
|
|
if (!user.data.urls) {
|
|
return false;
|
|
}
|
|
if (user.data && user.data.jsError) {
|
|
return false;
|
|
}
|
|
if (!user.detail.name) {
|
|
return true;
|
|
}
|
|
if (user.data.urls.find((l) => l.name == 'Email') == undefined) {
|
|
return true;
|
|
}
|
|
if (user.moderation !== 'accepted') {
|
|
return true;
|
|
}
|
|
return false;
|
|
});
|
|
};
|
|
exports.filter_invalid = filter_invalid;
|
|
const filter_email_missing = (users) => {
|
|
return users.filter((user) => {
|
|
if (!user.data) {
|
|
return false;
|
|
}
|
|
if (!user.geo) {
|
|
return false;
|
|
}
|
|
if (!user.data.urls) {
|
|
return false;
|
|
}
|
|
if (user.data && user.data.jsError) {
|
|
return false;
|
|
}
|
|
if (!user.detail) {
|
|
return false;
|
|
}
|
|
if (!user.detail.name) {
|
|
return false;
|
|
}
|
|
if (user.moderation !== 'accepted') {
|
|
return false;
|
|
}
|
|
if (!user.data.urls.find((l) => l.name == 'Email')) {
|
|
return true;
|
|
}
|
|
return false;
|
|
});
|
|
};
|
|
exports.filter_email_missing = filter_email_missing;
|
|
const filter_accepted = (users) => {
|
|
return users.filter((user) => {
|
|
if (!user.data) {
|
|
return false;
|
|
}
|
|
if (!user.geo) {
|
|
return false;
|
|
}
|
|
if (!user.data.urls) {
|
|
return false;
|
|
}
|
|
if (!user.detail.heroImageUrl) {
|
|
return false;
|
|
}
|
|
if (user.data && user.data.jsError) {
|
|
return false;
|
|
}
|
|
if (user.moderation !== 'accepted') {
|
|
return false;
|
|
}
|
|
return true;
|
|
});
|
|
};
|
|
exports.filter_accepted = filter_accepted;
|
|
const oa_user_email = (user) => {
|
|
if (!user.data) {
|
|
return false;
|
|
}
|
|
if (!user.geo) {
|
|
return false;
|
|
}
|
|
if (!user.data.urls) {
|
|
return false;
|
|
}
|
|
if (user.data && user.data.jsError) {
|
|
return false;
|
|
}
|
|
let u = user.data.urls.find((l) => l.name == 'Email');
|
|
if (u) {
|
|
return u.url.replace('mailto:', '');
|
|
}
|
|
};
|
|
exports.oa_user_email = oa_user_email;
|
|
const get_user_name = (user) => {
|
|
let ret = (0, utils_1.replaceAll)('--', '-', (0, lib_1.sanitize)(filenamify(user._id)).replace(/^\-+/g, '').replace(/\-$/, ''));
|
|
ret = ret.replace(/\-$/, '');
|
|
ret = ret.replace(/\_$/, '');
|
|
if (!(0, exports.oa_user_email)(user)) {
|
|
ret += '-uc';
|
|
}
|
|
return ret;
|
|
};
|
|
exports.get_user_name = get_user_name;
|
|
const get_user_display_name = (user) => (0, utils_1.replaceAll)('--', '-', (0, lib_1.sanitize)(filenamify(user.data.title)).replace(/^\-+/g, '').replace(/\-$/, ''));
|
|
exports.get_user_display_name = get_user_display_name;
|
|
const getDataPath = (_path = '') => path.resolve(path.join((0, fs_1.resolve)(constants_1.DATA_PATH), _path));
|
|
exports.getDataPath = getDataPath;
|
|
const getUsersPath = () => path.resolve((0, fs_1.resolve)(TEST ? constants_1.LATEST_TEST : constants_1.LATEST_TRACK));
|
|
exports.getUsersPath = getUsersPath;
|
|
const getUsers = () => (0, read_1.sync)(path.resolve((0, exports.getUsersPath)()), 'json') || [];
|
|
exports.getUsers = getUsers;
|
|
let uPage = 1;
|
|
let usersAll = [];
|
|
const _getForumUsers = async (d, page, detail) => {
|
|
if (uPage == 1) {
|
|
usersAll = [];
|
|
}
|
|
let users = await d.getUsers(page);
|
|
if (users.length) {
|
|
usersAll = usersAll.concat(users);
|
|
uPage++;
|
|
return (0, exports._getForumUsers)(d, uPage, detail);
|
|
}
|
|
else {
|
|
uPage = 1;
|
|
(0, write_1.sync)(path.resolve(constants_1.F_USERS_NOW), usersAll);
|
|
let fUsers = (0, read_1.sync)(path.resolve(constants_1.F_USERS_ALL), 'json') || [];
|
|
const add = async (u) => {
|
|
return new Promise((resolve, reject) => {
|
|
let fUser = fUsers.find((fu) => u.id == fu.id);
|
|
if (!fUser) {
|
|
fUsers.push(u);
|
|
fUser = u;
|
|
}
|
|
if (!fUser.detail) {
|
|
index_1.logger.debug('Retrieve User Detail ' + u.name);
|
|
setTimeout(() => {
|
|
d.getUser(fUser.id).then((detail) => {
|
|
if (detail) {
|
|
fUser.detail = detail;
|
|
}
|
|
(0, write_1.sync)(path.resolve('./fusers-all.json'), fUsers);
|
|
resolve(fUser);
|
|
});
|
|
}, 200);
|
|
}
|
|
else {
|
|
resolve(fUser);
|
|
}
|
|
});
|
|
};
|
|
return await bluebird_1.Promise.resolve(usersAll).map((u) => {
|
|
return add(u);
|
|
}, { concurrency: 1 });
|
|
}
|
|
};
|
|
exports._getForumUsers = _getForumUsers;
|
|
const getForumUsers = async (d, detail) => {
|
|
if (!constants_1.FETCH_DUSERS) {
|
|
return (0, read_1.sync)((0, exports.getDataPath)(constants_1.F_USERS_ALL), 'json') || [];
|
|
}
|
|
return (0, exports._getForumUsers)(d, uPage, detail);
|
|
};
|
|
exports.getForumUsers = getForumUsers;
|
|
const createUser = async (discourse, oa_user) => {
|
|
/*
|
|
Bazar
|
|
https://shop.osr-plastic.org
|
|
Website
|
|
website2
|
|
Instagram
|
|
https://www.instagram.com/osr_plastic/
|
|
Directory / Map Url
|
|
https://www.google.com/maps/contrib/117674167598277014013
|
|
OSR - Marketplace Url
|
|
https://shop.osr-plastic.org/plastichub/
|
|
*/
|
|
if (!oa_user.data.title) {
|
|
return -120;
|
|
}
|
|
let name = (0, utils_1.replaceAll)('--', '-', (0, exports.get_user_display_name)(oa_user).replace(/^\-+/g, '').replace(/\-$/, ''));
|
|
let user_name = (0, exports.get_user_name)(oa_user);
|
|
name = user_name.replace(/\-$/, '');
|
|
name = user_name.replace(/\_$/, '');
|
|
let opts = {
|
|
"name": name,
|
|
"email": (0, exports.oa_user_email)(oa_user) || `${user_name}_uc@osr-plastic.org`,
|
|
"password": (0, constants_1.DEFAULT_PASSWORD)(),
|
|
"username": user_name,
|
|
"active": true,
|
|
"approved": true,
|
|
"user_fields[1]": true
|
|
};
|
|
let user = await discourse.createUser(opts);
|
|
if (name.length < 4) {
|
|
return -120;
|
|
}
|
|
if (user_name.length > 50) {
|
|
return -120;
|
|
}
|
|
if (user && user.errors) {
|
|
if (user.message === "Username must be no more than 50 characters" ||
|
|
user.message === 'Username must not contain a sequence of 2 or more special chars (.-_)') {
|
|
return -120;
|
|
}
|
|
if (user.message === "Username must be unique" || user.message === "Primary email has already been taken") {
|
|
return -100;
|
|
}
|
|
if (user.errors.email && user.errors.username) {
|
|
user = await discourse.getUserByUsername(user_name);
|
|
if (user && user.id && !oa_user._didSetGroup) {
|
|
try {
|
|
let gret = await discourse.updateGroup(user_name, constants_1.OA_USER_IMPORT_GROUP);
|
|
}
|
|
catch (e) {
|
|
index_1.logger.error('error adding to group', user_name);
|
|
}
|
|
return user.id;
|
|
}
|
|
;
|
|
}
|
|
index_1.logger.error('Error creating user ' + user_name, user.errors);
|
|
}
|
|
if (user && user.user_id) {
|
|
try {
|
|
await discourse.updateGroup(user_name, constants_1.OA_USER_IMPORT_GROUP);
|
|
return user.user_id;
|
|
}
|
|
catch (e) {
|
|
index_1.logger.error('error adding to group', user_name);
|
|
return user.user_id;
|
|
}
|
|
}
|
|
else {
|
|
if (user && user.message && user.message == 'Username must be unique\nPrimary email has already been taken') {
|
|
index_1.logger.error('already created', oa_user.detail.name);
|
|
return -10;
|
|
}
|
|
else if (user && user.message && user.message == 'Your account is activated and ready to use.') {
|
|
if (user.user_id) {
|
|
return user.user_id;
|
|
}
|
|
return -10;
|
|
}
|
|
else {
|
|
index_1.logger.debug('cant create user ' + oa_user.detail.name, user);
|
|
}
|
|
return null;
|
|
}
|
|
return null;
|
|
};
|
|
exports.createUser = createUser;
|
|
const uploadAvatar = async (discourse, name, filePath) => {
|
|
const users = (0, exports.getUsers)();
|
|
const index = users.findIndex((u) => u.detail.name == name);
|
|
try {
|
|
const upped = await discourse.upload(1, filePath);
|
|
const data = upped.data;
|
|
if (data && data.id) {
|
|
users[index].upload_id = data.id;
|
|
index_1.logger.debug('uploaded avatar ' + name + ' ' + data.id);
|
|
(0, write_1.sync)((0, exports.getUsersPath)(), users);
|
|
}
|
|
else {
|
|
index_1.logger.error('upload - error', name);
|
|
}
|
|
return users;
|
|
}
|
|
catch (error) {
|
|
users[index].upload_id = -1;
|
|
index_1.logger.error('error uploading avatar', name);
|
|
(0, write_1.sync)((0, exports.getUsersPath)(), users);
|
|
}
|
|
};
|
|
exports.uploadAvatar = uploadAvatar;
|
|
const uploadAvatars = async (discourse, users) => {
|
|
const toBeUploaded = users.filter((u) => {
|
|
if (u.upload_id) {
|
|
return false;
|
|
}
|
|
const hero = (0, lib_1.getImageName)(u.detail.heroImageUrl);
|
|
const avatar = findAvatar(u, hero);
|
|
if (!avatar) {
|
|
index_1.logger.error('cant find avatar : ', u._id, hero);
|
|
return false;
|
|
}
|
|
u.avatar = avatar;
|
|
return true;
|
|
});
|
|
return await bluebird_1.Promise.resolve(toBeUploaded).map((u) => {
|
|
if (!u.detail.name) {
|
|
return;
|
|
}
|
|
index_1.logger.debug('upload avatar : ' + u._id);
|
|
const t = (0, exports.uploadAvatar)(discourse, u.detail.name, u.avatar);
|
|
return t;
|
|
}, { concurrency: 1 });
|
|
};
|
|
const findAvatar = (user, filename) => {
|
|
const root = path.resolve((0, fs_1.resolve)(constants_1.DATA_PATH));
|
|
const _path = path.resolve(`${root}/${user._id}/${filename}`);
|
|
if ((0, exists_1.sync)(_path)) {
|
|
return _path;
|
|
}
|
|
const files = fg.sync('**/**/*' + filename + '*', { dot: true, cwd: root, absolute: true });
|
|
if (files.length == 0) {
|
|
return false;
|
|
}
|
|
return files[0];
|
|
};
|
|
/////////////////////////////////////////////////////
|
|
//
|
|
// users
|
|
//
|
|
const updateUser = async (discorse, oa_user) => {
|
|
const users = (0, exports.getUsers)();
|
|
const index = users.findIndex((u) => u.detail.name == oa_user.detail.name);
|
|
const user_name = (0, utils_1.replaceAll)('--', '-', (0, exports.get_user_name)(oa_user).replace(/^\-+/g, '').replace(/\-$/, ''));
|
|
let ret = null;
|
|
try {
|
|
ret = await discorse.updateUser(user_name, {
|
|
name: oa_user.data.title
|
|
});
|
|
try {
|
|
let location;
|
|
if (oa_user.geo) {
|
|
location = `${oa_user.geo.continent} / ${oa_user.geo.countryName} / ${oa_user.geo.city} `;
|
|
}
|
|
let website;
|
|
if (oa_user.data) {
|
|
website = oa_user.data.urls.find((l) => l.name == 'Website');
|
|
if (website) {
|
|
website = website.url;
|
|
}
|
|
}
|
|
let description;
|
|
if (oa_user.data) {
|
|
if (oa_user.data.description) {
|
|
description += oa_user.data.description;
|
|
}
|
|
description += '\n';
|
|
if (oa_user.data.services) {
|
|
let services = `### Services \n`;
|
|
let hasServices = false;
|
|
for (let s in oa_user.data.services[0]) {
|
|
if (oa_user.data.services[0][s]) {
|
|
services += `- [x] ${(0, utils_1.capitalize)(s)}\n`;
|
|
hasServices = true;
|
|
}
|
|
}
|
|
if (hasServices) {
|
|
description += services;
|
|
}
|
|
}
|
|
}
|
|
let links = '';
|
|
if (oa_user.data.urls) {
|
|
links = oa_user.data.urls.filter((r) => r.name !== 'Bazar' && r.name !== 'sponsor the work').map((l) => {
|
|
let label = '' + l.name;
|
|
if (label === 'Social media') {
|
|
if (l.url.indexOf('facebook') !== -1) {
|
|
label = 'Facebook';
|
|
}
|
|
if (l.url.indexOf('instagram') !== -1) {
|
|
label = 'Instagram';
|
|
}
|
|
}
|
|
label += " - " + l.url;
|
|
label = label.replace("https://", "");
|
|
label = label.replace("http://", "");
|
|
label = label.replace("mailto:", "");
|
|
return `<a href="${l.url}">${label}</a>`;
|
|
}).join("<br/>\n");
|
|
description += '\n### Links\n';
|
|
description += links;
|
|
}
|
|
if (oa_user.location) {
|
|
description += `\n\n <a href="https://www.google.com/maps/search/${oa_user.location.lat},${oa_user.location.lng}">Get Directions</a>\n`;
|
|
}
|
|
let updatePrefs = await discorse.updateUserProfile(user_name, {
|
|
bio_raw: (0, utils_1.replaceAll)('undefined', '', description),
|
|
location,
|
|
website
|
|
});
|
|
}
|
|
catch (error) {
|
|
index_1.logger.error(`Error updating user prefs : ${user_name}`);
|
|
}
|
|
}
|
|
catch (error) {
|
|
index_1.logger.error('error updating user', oa_user._id, error.message);
|
|
return;
|
|
}
|
|
if (ret.status === 200) {
|
|
users[index].didUpdateName = true;
|
|
index_1.logger.debug('did update user', oa_user._id, ' # ', oa_user.data.title);
|
|
(0, write_1.sync)((0, exports.getUsersPath)(), users);
|
|
}
|
|
else {
|
|
index_1.logger.error('did update user failed ', oa_user._id);
|
|
}
|
|
};
|
|
exports.updateUser = updateUser;
|
|
const importUser = async (discorse, oa_user) => {
|
|
const users = (0, exports.getUsers)();
|
|
const index = users.findIndex((u) => u._id == oa_user._id);
|
|
let user = null;
|
|
try {
|
|
user = await (0, exports.createUser)(discorse, oa_user);
|
|
}
|
|
catch (error) {
|
|
debugger;
|
|
index_1.logger.error('error creating user', error);
|
|
return false;
|
|
}
|
|
if (user === -100) {
|
|
users[index].alreadyExists = true;
|
|
(0, write_1.sync)((0, exports.getUsersPath)(), users);
|
|
return;
|
|
}
|
|
if (user === -120) {
|
|
users[index].invalidData = true;
|
|
(0, write_1.sync)((0, exports.getUsersPath)(), users);
|
|
return;
|
|
}
|
|
if (user && users[index].upload_id && !users[index]._didSetAvatar) {
|
|
try {
|
|
await discorse.setUserAvatar((0, exports.get_user_name)(oa_user), users[index].upload_id);
|
|
}
|
|
catch (e) {
|
|
index_1.logger.error('error setting avatar', (0, exports.get_user_name)(oa_user));
|
|
}
|
|
}
|
|
const _t = users[index];
|
|
if (user > 0) {
|
|
users[index].f_id = user;
|
|
users[index]._didSetAvatar = true;
|
|
users[index]._didSetGroup = true;
|
|
index_1.logger.debug('\t created ' + oa_user.data.title);
|
|
(0, write_1.sync)((0, exports.getUsersPath)(), users);
|
|
}
|
|
else {
|
|
index_1.logger.error('cant create user - error', oa_user.detail.name, user);
|
|
}
|
|
return users[index];
|
|
};
|
|
exports.importUser = importUser;
|
|
const mergeLatestUsers = (discorse, options, oa_users) => {
|
|
const users = (0, exports.getUsers)();
|
|
oa_users.forEach((u) => {
|
|
const tUser = users.find((tu) => {
|
|
return tu._id === u._id;
|
|
});
|
|
if (!tUser) {
|
|
users.push(u);
|
|
}
|
|
});
|
|
index_1.logger.debug(`Merged users to ${(0, exports.getUsersPath)()}`);
|
|
(0, write_1.sync)((0, exports.getUsersPath)(), users);
|
|
return users;
|
|
};
|
|
exports.mergeLatestUsers = mergeLatestUsers;
|
|
const mergeLatestUsersTest = (discorse, options, oa_users) => {
|
|
const users = ((0, read_1.sync)(constants_1.LATEST_TEST, 'json') || []);
|
|
oa_users.forEach((u) => {
|
|
const tUser = users.find((u) => {
|
|
return u._id === u._id;
|
|
});
|
|
if (!tUser) {
|
|
users.push(u);
|
|
}
|
|
});
|
|
(0, write_1.sync)(options.track, users);
|
|
return users;
|
|
};
|
|
exports.mergeLatestUsersTest = mergeLatestUsersTest;
|
|
const importUsers = async (discorse, options, oa_users) => {
|
|
index_1.logger.debug('read users from ', path.resolve((0, exports.getUsersPath)()));
|
|
let users = (0, exports.mergeLatestUsers)(discorse, options, oa_users);
|
|
//const users = mergeLatestUsersTest(discorse, options, oa_users)
|
|
users = users.filter((u) => {
|
|
if (u.f_id || u.f_id < 0) {
|
|
return false;
|
|
}
|
|
if (u.detail.name === 'plastichub' || u.detail.name === 'lu' || u.detail.name === 'timberstar' || u.detail.name === 'nickname') {
|
|
return false;
|
|
}
|
|
if (u.alreadyExists || u.invalidData) {
|
|
return false;
|
|
}
|
|
return true;
|
|
});
|
|
index_1.logger.debug('Create Users ' + users.length + ' Total | Left: ' + users.length);
|
|
await uploadAvatars(discorse, users);
|
|
return await bluebird_1.Promise.resolve(users).map((u) => {
|
|
index_1.logger.debug('import user ' + (0, exports.get_user_name)(u));
|
|
try {
|
|
return new Promise((resolve, reject) => {
|
|
setTimeout(() => {
|
|
const d = (0, exports.importUser)(discorse, u);
|
|
if (d) {
|
|
d.then(resolve);
|
|
}
|
|
else {
|
|
reject();
|
|
}
|
|
}, 500);
|
|
});
|
|
}
|
|
catch (e) {
|
|
debugger;
|
|
index_1.logger.error('error creating user ' + u._id, e);
|
|
}
|
|
}, { concurrency: 1 });
|
|
};
|
|
exports.importUsers = importUsers;
|
|
const updateUsers = async (discorse, options, oa_users) => {
|
|
// https://forum.osr-plastic.org/u/easymoulds/preferences/profile
|
|
const users = (0, exports.mergeLatestUsers)(discorse, options, oa_users);
|
|
//const users = mergeLatestUsersTest(discorse, options, oa_users)
|
|
let toBeCreated = users.filter((u) => {
|
|
if (u.f_id || u.f_id < 0) {
|
|
return true;
|
|
}
|
|
if (u.didUpdateName) {
|
|
return false;
|
|
}
|
|
return true;
|
|
});
|
|
const testUser = 'easymoulds';
|
|
const test = toBeCreated.find((u) => {
|
|
return u._id === testUser;
|
|
});
|
|
// toBeCreated = [test]
|
|
return await bluebird_1.Promise.resolve(toBeCreated).map((u) => {
|
|
/*
|
|
if (u.didUpdateName) {
|
|
return false
|
|
}
|
|
*/
|
|
try {
|
|
return new Promise((resolve, reject) => {
|
|
setTimeout(() => {
|
|
const d = (0, exports.updateUser)(discorse, u);
|
|
if (d) {
|
|
d.then(resolve);
|
|
}
|
|
else {
|
|
reject();
|
|
}
|
|
}, 200);
|
|
});
|
|
}
|
|
catch (e) {
|
|
debugger;
|
|
index_1.logger.error('error creating user ' + u._id, e);
|
|
}
|
|
}, { concurrency: 1 });
|
|
};
|
|
exports.updateUsers = updateUsers;
|
|
const md_edit_wrap = (content, f, prefix = '', context = '') => {
|
|
return (0, js_beautify_1.html_beautify)(`<div prefix="${prefix}" file="${path.parse(f).base}" context="${context}" class="fragment">${content}</div>`);
|
|
};
|
|
exports.md_edit_wrap = md_edit_wrap;
|
|
const toHTML = (path, markdown) => {
|
|
const content = (0, read_1.sync)(path, 'string');
|
|
if (!markdown) {
|
|
let converter = new showdown_1.Converter({ tables: true });
|
|
converter.setOption('literalMidWordUnderscores', 'true');
|
|
return converter.makeHtml(content);
|
|
}
|
|
else {
|
|
return content;
|
|
}
|
|
};
|
|
exports.toHTML = toHTML;
|
|
const imageName = (url) => {
|
|
if (!url) {
|
|
return "";
|
|
}
|
|
try {
|
|
const parsed = URI.parse(decodeURIComponent(url));
|
|
const pParsed = path.parse(parsed.path);
|
|
return (0, lib_1.sanitize)(decodeURIComponent(pParsed.base));
|
|
}
|
|
catch (error) {
|
|
index_1.logger.error('error image name : ', url);
|
|
return "";
|
|
}
|
|
};
|
|
exports.imageName = imageName;
|
|
const read_fragments = (src, config, prefix = '', context = '') => {
|
|
if (!(0, exists_1.sync)(src)) {
|
|
//debug.warn(`Create template folder ${src}`);
|
|
(0, dir_1.sync)(src);
|
|
}
|
|
let fragments = (0, osr_cli_commons_1.files)(src, '*.html');
|
|
fragments.map((f) => {
|
|
config[path.parse(f).name] = (0, exports.md_edit_wrap)((0, exports.toHTML)(f, true), f, prefix, context);
|
|
});
|
|
fragments = (0, osr_cli_commons_1.files)(src, '*.md');
|
|
fragments.map((f) => {
|
|
config[path.parse(f).name] = (0, exports.md_edit_wrap)((0, exports.toHTML)(f, false), f, prefix, context);
|
|
});
|
|
return config;
|
|
};
|
|
exports.read_fragments = read_fragments;
|
|
const indexUsers = async (discorse, options, oa_users) => {
|
|
let users = (0, exports.mergeLatestUsers)(discorse, options, oa_users);
|
|
users = users.filter((u) => {
|
|
if (u.f_id && u.data && u.geo) {
|
|
return true;
|
|
}
|
|
return false;
|
|
});
|
|
const continents = [];
|
|
const countries = [];
|
|
const navIndex = [];
|
|
users.forEach((u) => {
|
|
if (!u.geo || !u.data || u.data.jsError || !u.detail || !u.detail.heroImageUrl) {
|
|
return;
|
|
}
|
|
if (!u.detail.heroImageUrl) {
|
|
return;
|
|
}
|
|
let code = null;
|
|
if (u.geo.continent && continents.indexOf(u.geo.continent) == -1) {
|
|
continents.push(u.geo.continent);
|
|
navIndex.push({
|
|
title: u.geo.continent,
|
|
url: `/users/${slugify(u.geo.continent)}.html`,
|
|
children: [],
|
|
code: u.geo.continentCode
|
|
// code:u.geo.continentCode
|
|
});
|
|
}
|
|
if (countries.indexOf(u.geo.countryName) == -1) {
|
|
countries.push(u.geo.countryName);
|
|
}
|
|
const c = navIndex.find((c) => c.title === u.geo.continent);
|
|
if (c) {
|
|
const cc = c.children.find((i) => i.title == u.geo.countryName);
|
|
if (!cc) {
|
|
c.children.push({
|
|
title: u.geo.countryName,
|
|
url: `/users/${slugify(c.title)}.html#${slugify(u.geo.countryName.toLocaleLowerCase())}`,
|
|
postTitle: `Directory - ${u.geo.countryName}`
|
|
});
|
|
}
|
|
}
|
|
});
|
|
navIndex.sort((a, b) => {
|
|
if (a.title < b.title) {
|
|
return -1;
|
|
}
|
|
if (a.title > b.title) {
|
|
return 1;
|
|
}
|
|
return 0;
|
|
});
|
|
navIndex.forEach((c) => {
|
|
c.children.sort((a, b) => {
|
|
if (a.title < b.title) {
|
|
return -1;
|
|
}
|
|
if (a.title > b.title) {
|
|
return 1;
|
|
}
|
|
return 0;
|
|
});
|
|
});
|
|
const directoryRoot = path.resolve((0, fs_1.resolve)('${OSR_ROOT}/osr-directory/pp'));
|
|
const createContinentPage = (continent) => {
|
|
const templates_path = path.resolve(`${directoryRoot}/templates`);
|
|
if (!(0, exists_1.sync)(templates_path)) {
|
|
index_1.logger.error(`\t Cant find templates at ${templates_path}, path doesn't exists`);
|
|
return;
|
|
}
|
|
const cPath = path.resolve(`${directoryRoot}/templates/config.json`);
|
|
const config = (0, read_1.sync)(cPath, 'json');
|
|
let fragments = { ...config };
|
|
(0, exports.read_fragments)(templates_path, fragments, "product_rel_path_name", "machine");
|
|
let templateCountry = (0, read_1.sync)(path.resolve(`${templates_path}/country_users.md`), 'string');
|
|
const ccountries = {};
|
|
let code = null;
|
|
users.forEach((u) => {
|
|
if (!u.geo || !u.data || u.data.jsError || !u.detail || !u.detail.heroImageUrl) {
|
|
return;
|
|
}
|
|
if (!u.detail.heroImageUrl) {
|
|
return;
|
|
}
|
|
if (u.geo.continent && u.geo.continent === continent) {
|
|
if (!code) {
|
|
code = u.geo.continentCode;
|
|
}
|
|
if (!ccountries[u.geo.countryName]) {
|
|
ccountries[u.geo.countryName] = [];
|
|
}
|
|
ccountries[u.geo.countryName].push(u);
|
|
}
|
|
});
|
|
if (continent === 'Africa') {
|
|
//debugger;
|
|
}
|
|
let weight = 100;
|
|
for (var country in ccountries) {
|
|
let cPage = "";
|
|
if (country === 'Kenya') {
|
|
//debugger;
|
|
}
|
|
cPage += `\n#### ${slugify(country)}\n\n`;
|
|
if (country === 'undefined' || country === 'unknown' || !country) {
|
|
return;
|
|
}
|
|
cPage += '<div class="container">';
|
|
cPage += '<div class=""><div class="col-12"><div class="list-group">';
|
|
let cusers = ccountries[country];
|
|
cusers = cusers.sort((a, b) => a.type === b.type ? 1 : -1);
|
|
const cUsersC = cusers.map((u) => {
|
|
const prefix = u.moderation === 'rejected' ? "<span style='color:red'>Censored</span>" : "";
|
|
const image = `/users/${u._id}/${encodeURIComponent((0, lib_1.sanitize)((0, exports.imageName)(u.detail.heroImageUrl)))}`;
|
|
const title = u.data && u.data.title ? u.data.title : u._id;
|
|
const uUrl = `/directory/users/${u._id}`;
|
|
let censored = u.moderation === 'rejected' ? '<span class="text-danger">Yes</span>' : 'No';
|
|
return `<div class="list-group-item d-flex align-items-center">
|
|
<a href="${uUrl}">
|
|
<img loading=lazy src="${image}" class="text-info mx-2 personLogo"/></a>
|
|
<div class="">
|
|
<a href="${uUrl}">${title}</a><br/>
|
|
<span>Type: ${u.type}</span><br/>
|
|
<span>Censored: ${censored}</span>
|
|
<br/>
|
|
<span class="personLocationInfo"> ${u.geo.principalSubdivision} / ${u.geo.locality} - ${u.geo.principalSubdivisionCode} - ${u.geo.postcode}</span>
|
|
</div>
|
|
</div>`;
|
|
});
|
|
cPage += cUsersC.join('');
|
|
cPage += '</div></div></div></div>';
|
|
country = country.replace(' (the)', '');
|
|
/*
|
|
const cPagePath = path.resolve(`${kb}/src/directory/users_${sanitize(slugify(country))}-${code}.md`)
|
|
|
|
const title = 'Users - ' + country;
|
|
|
|
cPage = substitute(templateCountry, {
|
|
...fragments,
|
|
title: title,
|
|
keywords: 'Precious Plastic, Precious Plastic Users - ' + country,
|
|
content: html_beautify(cPage),
|
|
continent: slugify(continent),
|
|
country: slugify(country),
|
|
identifier: country + "-" + continent,
|
|
weight: weight
|
|
});
|
|
|
|
weight++;
|
|
write(cPagePath, cPage);
|
|
console.log('write ' + cPagePath);
|
|
*/
|
|
}
|
|
/*
|
|
content = substitute(template, {
|
|
...fragments,
|
|
title: 'Precious Plastic - Users ' + continent,
|
|
keywords: 'Precious Plastic, Precious Plastic Users - ' + continent,
|
|
content: content,
|
|
continent: slugify(continent)
|
|
});
|
|
*/
|
|
//const index_md = path.resolve(`${root}/_pages/users_${code}.md`);
|
|
//write(index_md, content);
|
|
};
|
|
const templates_path = path.resolve(`${directoryRoot}/templates`);
|
|
const createCountryPages = async (index, indexPath) => {
|
|
let i = 0;
|
|
for await (const continent of index) {
|
|
const countries = continent.children;
|
|
for await (const country of countries) {
|
|
const d = 0;
|
|
}
|
|
}
|
|
};
|
|
await createCountryPages(navIndex, './');
|
|
const createIntroPage = async (users, index, dst) => {
|
|
let template = (0, read_1.sync)(path.resolve(`${templates_path}/intro_users.md`));
|
|
let content = "";
|
|
const usersPerCountry = (country) => {
|
|
return users.filter((u) => u.geo.countryName === country);
|
|
};
|
|
index.forEach((i) => {
|
|
const heading = `## ${i.title}`;
|
|
let countries = '';
|
|
i.children.forEach((c) => {
|
|
let title = c.title.replace(/ *\([^)]*\) */g, "");
|
|
const nb = usersPerCountry(c.title).length;
|
|
title = `${title} \(${nb}\)`;
|
|
const cPagePath = `/directory/users_${(0, lib_1.sanitize)(slugify(c.title))}-${i.code}`;
|
|
countries += `- [${(title)}](${cPagePath.toLowerCase()})\n`;
|
|
});
|
|
content += `${heading}\n ${countries}`;
|
|
});
|
|
(0, write_1.sync)(dst, (0, core_1.substitute)(template, {
|
|
content: content,
|
|
/*hidden: data.v3_mappins.filter((u) => u.moderation !== "accepted").length,
|
|
total: data.v3_mappins.length*/
|
|
}));
|
|
let data;
|
|
try {
|
|
data = await discorse.updatePost(constants_1.OA_DIRECTORY_OVERVIEW_TOPIC, content);
|
|
debugger;
|
|
//logger.debug('update post : ' + options.title + ' : ' + data.id + ' | topic id ' + data.topic_id)
|
|
}
|
|
catch (e) {
|
|
return false;
|
|
}
|
|
};
|
|
// await createIntroPage(users, navIndex, './index.md')
|
|
/*
|
|
|
|
return await BPromise.resolve(users).map((u: IImportUser) => {
|
|
try {
|
|
return new Promise((resolve, reject) => {
|
|
setTimeout(() => {
|
|
const d = updateUser(discorse, u)
|
|
if (d) {
|
|
d.then(resolve)
|
|
} else {
|
|
reject()
|
|
}
|
|
}, 200)
|
|
|
|
})
|
|
|
|
} catch (e) {
|
|
debugger;
|
|
logger.error('error creating user ' + u._id, e)
|
|
}
|
|
}, { concurrency: 1 })
|
|
|
|
*/
|
|
};
|
|
exports.indexUsers = indexUsers;
|
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbGliL29hL3VzZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLHVDQUE4QztBQUs5QywrQkFBOEM7QUFFOUMsa0RBQXdFO0FBQ3hFLDZCQUE0QjtBQUM1Qiw4Q0FBa0Q7QUFDbEQsa0RBQXNEO0FBQ3RELGdEQUFvRDtBQUVwRCx1REFBd0Q7QUFFeEQsdUNBQW9DO0FBRXBDLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQTtBQUVsQywyQ0FBNEQ7QUFFNUQsNkNBQTJDO0FBQzNDLDRDQUFrRDtBQUNsRCxpRUFBa0U7QUFDbEUsdUNBQW9DO0FBQ3BDLE1BQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQTtBQUU3QixzREFXK0I7QUFLL0IsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFBO0FBQ3hDLE1BQU0sRUFBRSxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQTtBQUcvQixNQUFNLElBQUksR0FBRyxLQUFLLENBQUE7QUFJWCxNQUFNLFVBQVUsR0FBRyxDQUFDLEdBQVcsRUFBZ0IsRUFBRTtJQUNwRCxNQUFNLEdBQUcsR0FBRyxJQUFBLFdBQUksRUFBQyxHQUFHLEVBQUUsTUFBTSxDQUFRLENBQUE7SUFDcEMsT0FBTyxHQUFHLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsQ0FBQTtBQUN2RCxDQUFDLENBQUE7QUFIWSxRQUFBLFVBQVUsY0FHdEI7QUFFTSxNQUFNLFlBQVksR0FBRyxDQUFDLEtBQW9CLEVBQUUsRUFBRTtJQUNqRCxPQUFPLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtRQUN6QixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRTtZQUNaLE9BQU8s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
|