Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"cSpell.words": [
"resourcejs"
]
}
109 changes: 55 additions & 54 deletions src/arango.js
Original file line number Diff line number Diff line change
@@ -1,68 +1,69 @@
import { Database, aql } from 'arangojs'
import { log, warn, error, Verbose } from './services.js'
import conf, { revealConf } from './conf.js'
import { Database, aql } from "arangojs";
import { log, error, Verbose } from "./services.js";
import conf from "./conf.js";

const verbose = Verbose('sd:arango'); verbose('')
const verbose = Verbose("sd:arango");
verbose("");

async function startArango () {
verbose('startArango')
try {
const dbInit = new Database(conf.arangodb.url)
await dbInit.createDatabase(conf.arangodb.database)
log('Database created:', conf.arangodb.database)
} catch (err) {
error('arango create db err:', err.message)
}
async function startArango() {
verbose("startArango");
try {
const dbInit = new Database(conf.arangodb.url);
await dbInit.createDatabase(conf.arangodb.database);
log("Database created:", conf.arangodb.database);
} catch (err) {
error("arango create db err:", err.message);
}

let db = null
try {
db = new Database({
url: conf.arangodb.url,
databaseName: conf.arangodb.database,
auth: {
username: conf.arangodb.auth.username,
password: conf.arangodb.auth.password,
},
})
log('Connected to Database')
} catch (err) {
error('arango connect to db err:', err.message)
}
let db = null;
try {
db = new Database({
url: conf.arangodb.url,
databaseName: conf.arangodb.database,
auth: {
username: conf.arangodb.auth.username,
password: conf.arangodb.auth.password,
},
});
log("Connected to Database");
} catch (err) {
error("arango connect to db err:", err.message);
}

const Pokemons = db.collection("my-pokemons")
try {
await Pokemons.create()
log('Collection created')
} catch (err) {
error('arango create collection err:', err.message)
}
const Pokemons = db.collection("my-pokemons");
try {
await Pokemons.create();
log("Collection created");
} catch (err) {
error("arango create collection err:", err.message);
}

try {
const doc = {
type: 'fire',
a: 'foo',
b: 'bar',
c: Date()
}
try {
const doc = {
type: "fire",
a: "foo",
b: "bar",
c: Date(),
};

let meta = await Pokemons.save(doc)
verbose('Arango document saved:', meta._rev)
const meta = await Pokemons.save(doc);
verbose("Arango document saved:", meta._rev);

const pokemons = await db.query(aql`
const pokemons = await db.query(aql`
FOR pokemon IN ${Pokemons}
FILTER pokemon.type == "fire"
RETURN pokemon
`)
const allPokemons = await pokemons.all()
verbose("allPokemans:", allPokemons)
// for (let pokemon of allPokemons) {
// verbose('pokemon:', pokemon)
// }
} catch (err) {
error('arango main err:', err.message)
}
`);
const allPokemons = await pokemons.all();
verbose("allPokemans:", allPokemons);
// for (let pokemon of allPokemons) {
// verbose('pokemon:', pokemon)
// }
} catch (err) {
error("arango main err:", err.message);
}
}

if (conf.arangodb.enable) {
startArango()
startArango();
}
12 changes: 5 additions & 7 deletions src/index.js
Original file line number Diff line number Diff line change
@@ -1,12 +1,10 @@
import https from 'https'
import http from 'http'
import { resolve } from 'path'
import { inspect } from 'util'
import { EventEmitter } from 'events'
import { readFileSync } from 'fs'
import https from 'node:https'
import http from 'node:http'
import { inspect } from 'node:util'
import { EventEmitter } from 'node:events'
import { readFileSync } from 'node:fs'

import express from 'express'
import passport from 'passport'
import morgan from 'morgan'
import responseTime from 'response-time'
import cookieParser from 'cookie-parser'
Expand Down
2 changes: 1 addition & 1 deletion src/mailer.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { createTransport } from 'nodemailer'
import { log, Verbose } from './services.js'
import { Verbose } from './services.js'
import conf from './conf.js'

const verbose = Verbose('sd:mailer'); verbose('')
Expand Down
3 changes: 1 addition & 2 deletions src/middleware/session.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
import session from 'express-session'
import MongoStore from 'connect-mongo'
import mongoose from 'mongoose'

import conf from '../conf.js'
import db, { mongoOptions } from '../mongo.js'
import { mongoOptions } from '../mongo.js'

export const sessionStore = MongoStore.create({
mongoUrl: conf.db.url,
Expand Down
5 changes: 2 additions & 3 deletions src/models/user.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import { error, Verbose } from '../services.js'

const verbose = Verbose('sd:models/user'); verbose('')

const { Mixed } = mongoose.Schema.Types
// const { Mixed } = mongoose.Schema.Types

const schema = mongoose.Schema({
email: { type: String, unique: true, required: true },
Expand Down Expand Up @@ -38,8 +38,7 @@ schema.methods.isAdmin = () =>

schema.static.getByEmail = async ({ email }) => {
try {
const user = await db.collection('users').findOne({ email })
return user
return await db.collection('users').findOne({ email })
} catch (err) {
error('User.getByEmail error:', err)
throw new Error(err)
Expand Down
1 change: 0 additions & 1 deletion src/rest-api.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import crypto from 'crypto'
import { join } from 'path'
import resourceJS from 'resourcejs'
import lodash from 'lodash'
const { isArray } = lodash
Expand Down
7 changes: 1 addition & 6 deletions src/routes/ask.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,19 +4,14 @@ import { checkAuth, checkAPIAuth } from '../middleware/check-auth.js'
import Dialog from '../models/dialog.js'
import { Verbose } from '../services.js'
import conf from '../conf.js'
// import util from 'util'
// import { exec } from 'child_process'

const verbose = Verbose('sd:routes/ask'); verbose('')
const router = Router()

const ask = async (req, res, next) => {
// verbose('ask req.headers:', req.headers)
// verbose('ask req.user:', req.user)
const ask = async (req, res) => {
try {
const { prompt } = req.body
let reply = ''
// verbose('prompt:', prompt)
if (conf.agency.enable) {
const response = await axios.post(`${conf.agency.url}/chat`, {
prompt
Expand Down
7 changes: 1 addition & 6 deletions src/routes/available.js
Original file line number Diff line number Diff line change
@@ -1,16 +1,11 @@
import { Router } from 'express'
import axios from 'axios'
import { Verbose } from '../services.js'
import conf from '../conf.js'

const verbose = Verbose('sd:routes/available'); verbose('')
const app = Router()

app.get('/', async (req, res, next) => {
app.get('/', async (req, res) => {
try {
// const response = await axios.get(`${conf.snake.url}/available`)
// // verbose('response.data:', response.data)
// return res.json(response.data)
return res.json({
result: 'ok',
name: "selfdev-api v1",
Expand Down
7 changes: 2 additions & 5 deletions src/routes/forgot.js
Original file line number Diff line number Diff line change
@@ -1,19 +1,16 @@
import { Router } from 'express'
import lodash from 'lodash'
const { isEmpty } = lodash
import { randomBytes } from 'crypto'

import { log, Verbose } from '../services.js'
import User from '../models/user.js'
import { validateEmail } from '../utils/validation.js'
import conf from '../conf.js'
import { transporter } from '../mailer.js'

const verbose = Verbose('sd:routes/forgot'); verbose('')
const router = Router()

const app = router
app.post('/', async (req, res, next) => {
app.post('/', async (req, res) => {
// verbose('forgot req.body:', req.body)
const { email } = req.body
let token = null
Expand Down Expand Up @@ -48,7 +45,7 @@ Hi,
We just received a requested to reset your password on Self-developing AI.

Please, click the link below to reset password:
${conf.webApp.origin + '/reset?token=' + token}
${conf.webApp.origin}/reset?token=${token}

This link will expire within ${conf.reset.expiresMinutes} minutes.

Expand Down
8 changes: 1 addition & 7 deletions src/routes/interest.js
Original file line number Diff line number Diff line change
@@ -1,13 +1,7 @@
import { Router } from 'express'
import lodash from 'lodash'
const { isEmpty } = lodash
import { log, warn, Verbose } from '../services.js'
import { validateEmail, validatePhone, validatePassword } from '../utils/validation.js'
import { transporter } from '../mailer.js'
import conf from '../conf.js'
import Landing from '../models/landing.js'
import Interest from '../models/interest.js'
import { checkAuth, checkAPIAuth } from '../middleware/check-auth.js'
import { checkAPIAuth } from '../middleware/check-auth.js'

const verbose = Verbose('sd:routes/land'); verbose('')
const router = Router()
Expand Down
11 changes: 3 additions & 8 deletions src/routes/land.js
Original file line number Diff line number Diff line change
@@ -1,17 +1,12 @@
import { Router } from 'express'
import lodash from 'lodash'
const { isEmpty } = lodash
import { log, warn, Verbose } from '../services.js'
import { validateEmail, validatePhone, validatePassword } from '../utils/validation.js'
import { transporter } from '../mailer.js'
import conf from '../conf.js'
import { Verbose } from '../services.js'
import Landing from '../models/landing.js'
import { checkAuth, checkAPIAuth } from '../middleware/check-auth.js'
import { checkAPIAuth } from '../middleware/check-auth.js'

const verbose = Verbose('sd:routes/land'); verbose('')
const router = Router()

const land = async (req, res, next) => {
const land = async (req, res) => {
// verbose('Land req.body:', req.body)
try {
const { body, title, favicon, interestForm } = req.body
Expand Down
2 changes: 1 addition & 1 deletion src/routes/login.js
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ const rememberMe = (req, res, next) => {
}

router.post('/', rememberMe, (req, res, next) => {
passport.authenticate('local', (err, user, info) => {
passport.authenticate('local', (err, user, _info) => {
if (err) {
return next(err)
}
Expand Down
34 changes: 18 additions & 16 deletions src/routes/mail.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
import { Router } from 'express'
import lodash from 'lodash'
const { isEmpty } = lodash
import { log, warn, Verbose } from '../services.js'
import { validateEmail, validatePhone, validatePassword } from '../utils/validation.js'
import { validateEmail } from '../utils/validation.js'
import { transporter } from '../mailer.js'
import conf from '../conf.js'
import Mailed from '../models/mailed.js'
Expand All @@ -11,25 +9,29 @@ import { checkAuth, checkAPIAuth } from '../middleware/check-auth.js'
const verbose = Verbose('sd:routes/mail'); verbose('')
const router = Router()

const mail = async (req, res, next) => {
const mail = async (req, res) => {
verbose('Mail req.body:', req.body)
try {
const { to, from, subject, text } = req.body

if (!to) {
to = user.email
warn('The field "to" is omitted, substitute with default:', to)
let newTo = to
let newFrom = from

if (!newTo) {
newTo = user.email
warn('The field "to" is omitted, substitute with default:', newTo)
}
if (!from) {
from = conf.smtp.from
warn('The field "from" is omitted, substitute with default:', from)

if (!newFrom) {
newFrom = conf.smtp.from
warn('The field "from" is omitted, substitute with default:', newFrom)
}

let validationError = ''
if (to && !validateEmail(to)) {
if (newTo && !validateEmail(newTo)) {
validationError += 'Invalid email to address. '
}
if (from && !validateEmail(from)) {
if (newFrom && !validateEmail(newFrom)) {
validationError += 'Invalid email from address. '
}

Expand All @@ -40,16 +42,16 @@ const mail = async (req, res, next) => {
})
}

log('Sending a mail to:', to, ', from:', from)
log('Sending a mail to:', newTo, ', from:', newFrom)
const mail = await transporter.sendMail({
from,
to,
from: newFrom,
to: newTo,
subject,
text,
})
log('Mail sent:', mail)

const mailed = new Mailed({ userId: req.user._id, from, to, subject, text })
const mailed = new Mailed({ userId: req.user._id, from: newFrom, to: newTo, subject, text })
await mailed.save()
res.json({
result: 'ok',
Expand Down
7 changes: 1 addition & 6 deletions src/routes/reset.js
Original file line number Diff line number Diff line change
@@ -1,19 +1,14 @@
import { Router } from 'express'
import lodash from 'lodash'
const { isEmpty } = lodash
import { randomBytes } from 'crypto'

import { log, warn, error, Verbose } from '../services.js'
import User from '../models/user.js'
import { validateEmail } from '../utils/validation.js'
import conf from '../conf.js'
import { transporter } from '../mailer.js'

const verbose = Verbose('sd:routes/reset'); verbose('')
const router = Router()

const app = router
app.post('/', async (req, res, next) => {
app.post('/', async (req, res) => {
// verbose('reset req.body:', req.body)
const { token, password } = req.body

Expand Down
Loading