Working on new version of website

Signed-off-by: Arthur DANJOU <arthurdanjou@outlook.fr>
This commit is contained in:
2021-08-05 15:26:36 +02:00
parent ed17d86913
commit 721eb3addc
43 changed files with 525 additions and 320 deletions

View File

@@ -2,7 +2,7 @@
"commands": {
"dump:rcfile": {
"settings": {},
"commandPath": "@adonisjs/core/build/commands/DumpRc",
"commandPath": "@adonisjs/core/commands/DumpRc",
"commandName": "dump:rcfile",
"description": "Dump contents of .adonisrc.json file along with defaults",
"args": [],
@@ -13,7 +13,7 @@
"settings": {
"loadApp": true
},
"commandPath": "@adonisjs/core/build/commands/ListRoutes",
"commandPath": "@adonisjs/core/commands/ListRoutes",
"commandName": "list:routes",
"description": "List application routes",
"args": [],
@@ -29,7 +29,7 @@
},
"generate:key": {
"settings": {},
"commandPath": "@adonisjs/core/build/commands/GenerateKey",
"commandPath": "@adonisjs/core/commands/GenerateKey",
"commandName": "generate:key",
"description": "Generate a new APP_KEY secret",
"args": [],

View File

@@ -0,0 +1,63 @@
import {HttpContextContract} from "@ioc:Adonis/Core/HttpContext";
import Announce from "App/Models/Announce";
import AnnounceStoreValidator from "App/Validators/announce/AnnounceStoreValidator";
import AnnounceUpdateValidator from "App/Validators/announce/AnnounceUpdateValidator";
import getTranslation from "App/Tasks/getTranslation";
import File from "App/Models/File";
export default class AnnouncesController {
public async index ({ response }: HttpContextContract) {
const announce = await Announce.query().orderBy('created_at', 'desc').first()
return response.status(200).send({
announce: announce
})
}
public async store ({ request, response }: HttpContextContract) {
const data = await request.validate(AnnounceStoreValidator)
const announce = new Announce()
const translation = await getTranslation(data.code)
await announce.related('message').associate(translation)
const cover = await File.findBy('label', data.cover)
if (cover) await announce.related('cover').save(cover)
return response.status(200).send({
announce: announce.save()
})
}
public async show ({ params, response }: HttpContextContract) {
return response.status(200).send({
user: await Announce.findOrFail(params.id)
})
}
public async update({ request, params, response }: HttpContextContract) {
const data = await request.validate(AnnounceUpdateValidator)
const announce = await Announce.findOrFail(params.id)
if (data.code) {
const translation = await getTranslation(data.code)
await announce.related('message').associate(translation)
}
const cover = await File.findBy('label', data.cover)
if (cover) await announce.related('cover').save(cover)
return response.status(200).send({
announce
})
}
public async destroy ({ response, params }: HttpContextContract) {
const announce = await Announce.findOrFail(params.id)
await announce.delete()
return response.status(200).send({
message: 'Announce successfully deleted!'
})
}
}

View File

@@ -4,13 +4,13 @@ import File from "App/Models/File";
export default class FileController {
public async index({response}: HttpContextContract) {
public async index ({ response }: HttpContextContract) {
return response.status(200).send({
files: File.query()
})
}
public async store({request, response}: HttpContextContract) {
public async store ({ request, response }: HttpContextContract) {
const file = await request.file('file', {
extnames: ['jpg', 'png', 'jpeg']
})
@@ -35,7 +35,7 @@ export default class FileController {
})
}
public async destroy({params, response}: HttpContextContract) {
public async destroy ({ params, response }: HttpContextContract) {
const file = await File.findOrFail(params.id)
await file.delete()
return response.status(200).send({

View File

@@ -1,18 +1,34 @@
import {HttpContextContract} from '@ioc:Adonis/Core/HttpContext'
import FormValidator from "App/Validators/FormValidator";
import FormStoreValidator from "App/Validators/form/FormStoreValidator";
import Form from "App/Models/Form";
import FormConfirmation from "App/Mailers/FormConfirmation";
export default class FormsController {
public async send({ request, response }: HttpContextContract) {
const data = await request.validate(FormValidator)
await Form.create(data)
await new FormConfirmation(data.name, data.email).preview()
//todo send confirmation email + email to me
public async index ({ response }: HttpContextContract) {
return response.status(200).send({
message: 'Form successfully received !'
forms: Form.query().orderBy('created_at', 'asc')
})
}
public async store ({ request, response }: HttpContextContract) {
const data = await request.validate(FormStoreValidator)
//todo send confirmation email + email to me with FormConfirmation
return response.status(200).send({
form: await Form.create(data)
})
}
public async show ({ params, response }: HttpContextContract) {
return response.status(200).send({
form: await Form.findOrFail(params.id)
})
}
public async destroy ({ response, params }: HttpContextContract) {
const form = await Form.findOrFail(params.id)
await form.delete()
return response.status(200).send({
message: 'Form successfully deleted!'
})
}

View File

@@ -5,7 +5,7 @@ import User from "App/Models/User";
export default class GuestBookController {
public async index ({response}: HttpContextContract) {
public async index ({ response }: HttpContextContract) {
const guestbook_messages = await GuestbookMessage
.query()
.preload('user')
@@ -15,7 +15,7 @@ export default class GuestBookController {
})
}
public async store ({request, response}: HttpContextContract) {
public async store ({ request, response }: HttpContextContract) {
const data = await request.validate(GuestValidator)
let user = await User.findBy('email', data.email)
if (!user) {
@@ -34,7 +34,21 @@ export default class GuestBookController {
})
}
public async get ({params, response}: HttpContextContract) {
public async show ({ params, response }: HttpContextContract) {
return response.status(200).send({
guestbook_message: await GuestbookMessage.findOrFail(params.id)
})
}
public async destroy ({ params, response }: HttpContextContract) {
const guestbook_message = await GuestbookMessage.findOrFail(params.id)
await guestbook_message.delete()
return response.status(200).send({
message: 'GuestBookMessage successfully deleted!'
})
}
public async exists ({ params, response }: HttpContextContract) {
const email = await params.email
const guestbook_message = await GuestbookMessage.findBy('email', email)
return response.status(200).send({

View File

@@ -4,7 +4,7 @@ import LocationValidator from "App/Validators/location/LocationValidator";
export default class LocationsController {
public async get ({ response }: HttpContextContract) {
public async index ({ response }: HttpContextContract) {
const location = await Location.query().orderBy('since', 'desc').first()
if (location) {
return response.status(200).send({
@@ -23,9 +23,9 @@ export default class LocationsController {
public async store ({ request, response }: HttpContextContract) {
const data = await request.validate(LocationValidator)
await Location.create(data)
const location = await Location.create(data)
return response.status(200).send({
message: 'Location successfully added !'
location
})
}

View File

@@ -3,7 +3,7 @@ import {HttpContextContract} from "@ioc:Adonis/Core/HttpContext";
export default class PostsController {
public async getLikes({params, response}: HttpContextContract) {
public async getLikes ({ params, response }: HttpContextContract) {
let post = await Post.findBy('slug', params.slug)
if (!post) {
@@ -18,7 +18,7 @@ export default class PostsController {
})
}
public async like ({params, response}: HttpContextContract) {
public async like ({ params, response }: HttpContextContract) {
let post = await Post.findBy('slug', params.slug)
if (!post) {
@@ -38,7 +38,7 @@ export default class PostsController {
})
}
public async unlike ({params, response}: HttpContextContract) {
public async unlike ({ params, response }: HttpContextContract) {
let post = await Post.findByOrFail('slug', params.slug)
const getLikes = post.likes - 1

View File

@@ -48,7 +48,7 @@ export default class ProfileController {
}
//todo get discord Activity
public async discord({response}: HttpContextContract) {
public async discord ({ response }: HttpContextContract) {
const activity = await getDiscordActivity()
return response.status(200).send({
status: activity

View File

@@ -0,0 +1,23 @@
import {HttpContextContract} from "@ioc:Adonis/Core/HttpContext";
import Profile from "App/Models/Profile";
import ProfileUpdateValidator from "App/Validators/profile/ProfileUpdateValidator";
export default class ProfilesController {
public async index ( { response }: HttpContextContract ) {
return response.status(200).send({
profile: await Profile.first()
})
}
public async update ( { response, request }: HttpContextContract ) {
const profile = await Profile.firstOrFail()
const data = await request.validate(ProfileUpdateValidator)
await profile.merge(data).save()
return response.status(200).send({
profile
})
}
}

View File

@@ -1,20 +1,55 @@
import {HttpContextContract} from '@ioc:Adonis/Core/HttpContext'
import Project from "App/Models/Project";
import ProjectValidator from "App/Validators/project/ProjectValidator";
import ProjectStoreValidator from "App/Validators/project/ProjectStoreValidator";
import ProjectUpdateValidator from "App/Validators/project/ProjectUpdateValidator";
import File from "App/Models/File";
export default class ProjectsController {
public async get ({ response }: HttpContextContract) {
public async index ({ response }: HttpContextContract) {
return response.status(200).send({
projects: await Project.query().orderBy('id', 'asc')
projects: await Project.query()
.orderBy('id', 'asc')
.preload('cover')
})
}
public async store ({ request, response}: HttpContextContract) {
const data = await request.validate(ProjectValidator)
await Project.create(data)
public async store ({ request, response }: HttpContextContract) {
const data = await request.validate(ProjectStoreValidator)
const project = await Project.create(data)
const cover = await File.findByOrFail('label', data.cover)
await project.related('cover').save(cover)
return response.status(200).send({
message: 'Project successfully created'
project
})
}
public async show ({ params, response }: HttpContextContract) {
const project = await Project.findOrFail(params.id)
await project.load('cover')
return response.status(200).send({
project
})
}
public async update ({ request, params, response }: HttpContextContract) {
const project = await Project.findOrFail(params.id)
const data = await request.validate(ProjectUpdateValidator)
const cover = await File.findBy('label', data.cover)
await project.merge(data).save()
if (cover) await project.related('cover').save(cover)
return response.status(200).send({
project
})
}
public async destroy ({ response, params }: HttpContextContract) {
const project = await Project.findOrFail(params.id)
await project.delete()
return response.status(200).send({
message: 'Project successfully deleted!'
})
}

View File

@@ -1,59 +0,0 @@
import {HttpContextContract} from "@ioc:Adonis/Core/HttpContext";
import Redis from "@ioc:Adonis/Addons/Redis";
import {UpdateGitHubReadme} from "App/Tasks/UpdateGithubReadme";
export default class StatesController {
public async get({response}: HttpContextContract) {
return response.status(200).send({
states: {
"is_sleeping": this.getStatus(await Redis.get(`states:is_sleeping`)),
"is_developing": this.getStatus(await Redis.get(`states:is_developing`)),
"is_learning": this.getStatus(await Redis.get(`states:is_learning`)),
"is_listening_music": this.getStatus(await Redis.get(`states:is_listening_music`)),
}
})
}
public async set({request, response, params}: HttpContextContract) {
const state = params.state
const value = await request.input('value')
if (state && value) {
await Redis.set(`states:${state}`, value)
if (value === 'true') {
switch (state) {
case 'learning':
await Redis.set(`states:developing`, 'false')
await Redis.set(`states:sleeping`, 'false')
break
case 'developing':
await Redis.set(`states:learning`, 'false')
await Redis.set(`states:sleeping`, 'false')
break
case 'listening':
await Redis.set(`states:sleeping`, 'false')
break
case 'sleeping':
await Redis.set(`states:developing`, 'false')
await Redis.set(`states:listening`, 'false')
await Redis.set(`states:learning`, 'false')
break
}
}
await UpdateGitHubReadme()
return response.status(200).send({
message: 'State successfully updated!'
})
}
}
public getStatus(state: string | null): string {
if (state === null) return "No"
return state === 'true' ? "Yes" : "No"
}
}

View File

@@ -1,39 +1,30 @@
import {HttpContextContract} from '@ioc:Adonis/Core/HttpContext'
import Subscriber from "App/Models/Subscriber";
import SubscriberValidator from "App/Validators/subscriber/SubscriberValidator";
import SubscriberStoreValidator from "App/Validators/subscriber/SubscriberStoreValidator";
export default class SubscribersController {
public async get ({ response }: HttpContextContract) {
public async index ({ response }: HttpContextContract) {
const subscribers = await Subscriber.query()
return response.status(200).send({
count: subscribers.length
count: subscribers.length,
subscribers: subscribers
})
}
public async store({request, response}: HttpContextContract) {
const data = await request.validate(SubscriberValidator)
const email = await Subscriber.findBy('email', data.email)
if (email) {
return response.status(201).send({
message: 'Subscriber already exists'
})
}
await Subscriber.create(data)
public async store ({ request, response }: HttpContextContract) {
const data = await request.validate(SubscriberStoreValidator)
return response.status(200).send({
message: 'Subscriber successfully registered!'
subscriber: await Subscriber.create(data)
})
}
public async delete({request, response}: HttpContextContract) {
const data = await request.validate(SubscriberValidator)
const subscriber = await Subscriber.findBy('email', data.email)
if (subscriber) {
await subscriber.delete()
return response.status(200).send({
message: 'Subscriber successfully deleted!'
})
}
public async destroy ({ params, response }: HttpContextContract) {
const subscriber = await Subscriber.findOrFail(params.id)
await subscriber.delete()
return response.status(200).send({
message: 'Subscriber successfully deleted!'
})
}
}

View File

@@ -0,0 +1,45 @@
import {HttpContextContract} from "@ioc:Adonis/Core/HttpContext";
import Translation from "App/Models/Translation";
import TranslationStoreValidator from "App/Validators/translation/TranslationStoreValidator";
import TranslationUpdateValidator from "App/Validators/translation/TranslationUpdateValidator";
export default class TranslationsController {
public async index ({ response }: HttpContextContract) {
return response.status(200).send({
translations: Translation.query()
})
}
public async store ({ request, response }: HttpContextContract) {
const data = await request.validate(TranslationStoreValidator)
return response.status(200).send({
translation: await Translation.create(data)
})
}
public async show ({ params, response }: HttpContextContract) {
return response.status(200).send({
translation: await Translation.findOrFail(params.id)
})
}
public async update ({ request, params, response }: HttpContextContract) {
const translation = await Translation.findOrFail(params.id)
const data = await request.validate(TranslationUpdateValidator)
await translation.merge(data).save()
return response.status(200).send({
translation
})
}
public async destroy ({ response, params }: HttpContextContract) {
const translation = await Translation.findOrFail(params.id)
await translation.delete()
return response.status(200).send({
message: 'Translation successfully deleted!'
})
}
}

View File

@@ -1,40 +1,40 @@
import {HttpContextContract} from '@ioc:Adonis/Core/HttpContext'
import User from "App/Models/User";
import UserStoreValidator from "App/Validators/users/UserStoreValidator";
import UserUpdateValidator from "App/Validators/users/UserUpdateValidator";
import UserStoreValidator from "App/Validators/user/UserStoreValidator";
import UserUpdateValidator from "App/Validators/user/UserUpdateValidator";
export default class UsersController {
public async index({response}: HttpContextContract) {
public async index ({ response }: HttpContextContract) {
return response.status(200).send({
users: User.query()
})
}
public async store({request, response}: HttpContextContract) {
public async store ({ request, response }: HttpContextContract) {
const data = await request.validate(UserStoreValidator)
return response.status(200).send({
user: await User.create(data)
})
}
public async show({params, response}: HttpContextContract) {
public async show ({ params, response }: HttpContextContract) {
return response.status(200).send({
user: await User.findOrFail(params.id)
})
}
public async update({request, params, response}: HttpContextContract) {
public async update ({ request, params, response }: HttpContextContract) {
const user = await User.findOrFail(params.id)
const data = await request.validate(UserUpdateValidator)
await user.merge(data).save()
return response.status(200).send({
message: 'User successfully updated!'
user
})
}
public async destroy({ response, params, auth }: HttpContextContract) {
public async destroy ({ response, params, auth }: HttpContextContract) {
const user = await User.findOrFail(params.id)
const admin = await User.findBy('email', 'arthurdanjou@outlook.fr')

View File

@@ -1,55 +0,0 @@
import Redis from "@ioc:Adonis/Addons/Redis";
import axios from 'axios'
import Env from "@ioc:Adonis/Core/Env";
export async function UpdateGitHubReadme(): Promise<void> {
const sleeping = await Redis.get('states:sleeping')
const learning = await Redis.get('states:learning')
const developing = await Redis.get('states:developing')
const listening_music = await Redis.get('states:listening')
const infos_table = `| Informations | State |
| ---------------------------: | ------: |
| :musical_note: Music Playing | **${getStatus(listening_music)}** |
| :bed: Sleeping | **${getStatus(sleeping)}** |
| :computer: Developing | **${getStatus(developing)}** |
| :books: Learning | **${getStatus(learning)}** |`
let change = true;
const {data: read_me} = await axios.get('https://api.github.com/repos/arthurdanjou/arthurdanjou/readme', {
headers: {
authorization: `Bearer ${Env.get('GITHUB_TOKEN')}`
},
})
const content = Buffer.from(read_me.content, 'base64').toString()
const infos_table_check = '| Informations' + content.split('| Informations')[1]
if (!infos_table_check) change = true
const old_infos_table = infos_table_check.split('###### Curious')[0]
if (!old_infos_table) change = true
if (!change) return
await axios.put('https://api.github.com/repos/ArthurDanjou/ArthurDanjou/contents/README.md',
{
message: 'Updating recent statistics & informations',
content: Buffer.from(content.replace(old_infos_table, infos_table + '\n\n'), 'utf8').toString('base64'),
sha: read_me.sha,
author: {
name: 'api.arthurdanjou.fr - API Automation',
email: 'me@arthurdanjou.fr'
}
}, {
headers: {
authorization: `Bearer ${Env.get('GITHUB_TOKEN')}`
}
}
)
}
function getStatus(state): string {
if (state === null) return "No"
return state === "true" ? "Yes" : "No"
}

View File

@@ -0,0 +1,9 @@
import Translation from "App/Models/Translation";
export default async function getTranslation(code: string): Promise<Translation> {
let translation = await Translation.findBy('code', code)
if (!translation) {
translation = await Translation.create({code: code})
}
return translation
}

View File

@@ -1,8 +1,9 @@
import { HttpContextContract } from '@ioc:Adonis/Core/HttpContext'
import {HttpContextContract} from '@ioc:Adonis/Core/HttpContext'
import {rules, schema} from '@ioc:Adonis/Core/Validator'
export default class AuthValidator {
constructor (private ctx: HttpContextContract) {
public messages = {
required: 'The field {{field}} is required'
}
public schema = schema.create({
@@ -16,11 +17,6 @@ export default class AuthValidator {
remember_me: schema.boolean()
})
public cacheKey = this.ctx.routeKey
public messages = {
'email.email': 'L\'adresse mail n\'est pas valide !',
'email.required': 'Veuillez renseigner une adresse mail !',
'password.required': 'Veuillez renseigner un mot de passe !',
constructor (protected ctx: HttpContextContract) {
}
}

View File

@@ -1,16 +0,0 @@
import { schema } from '@ioc:Adonis/Core/Validator'
import { HttpContextContract } from '@ioc:Adonis/Core/HttpContext'
export default class FormValidator {
constructor (protected ctx: HttpContextContract) {
}
public schema = schema.create({
name: schema.string(),
email: schema.string(),
subject: schema.string(),
content: schema.string()
})
public messages = {}
}

View File

@@ -0,0 +1,15 @@
import {schema} from '@ioc:Adonis/Core/Validator'
import {HttpContextContract} from '@ioc:Adonis/Core/HttpContext'
export default class AnnounceStoreValidator {
public schema = schema.create({
code: schema.string(),
cover: schema.string.optional()
})
public messages = {
required: 'The field {{ field }} is required'
}
constructor (protected ctx: HttpContextContract) {
}
}

View File

@@ -0,0 +1,15 @@
import {schema} from '@ioc:Adonis/Core/Validator'
import {HttpContextContract} from '@ioc:Adonis/Core/HttpContext'
export default class AnnounceUpdateValidator {
public schema = schema.create({
code: schema.string.optional(),
cover: schema.string.optional()
})
public messages = {
required: 'The field {{field}} is required'
}
constructor (protected ctx: HttpContextContract) {
}
}

View File

@@ -0,0 +1,18 @@
import {schema} from '@ioc:Adonis/Core/Validator'
import {HttpContextContract} from '@ioc:Adonis/Core/HttpContext'
export default class FormStoreValidator {
constructor (protected ctx: HttpContextContract) {
}
public schema = schema.create({
name: schema.string(),
email: schema.string(),
subject: schema.string(),
content: schema.string()
})
public messages = {
required: 'The field {{field}} is required'
}
}

View File

@@ -2,7 +2,9 @@ import {HttpContextContract} from '@ioc:Adonis/Core/HttpContext'
import {rules, schema} from '@ioc:Adonis/Core/Validator'
export default class GuestValidator {
constructor (private ctx: HttpContextContract) {
public messages = {
required: 'The field {{field}} is required',
'email.email': 'The email is not correct'
}
public schema = schema.create({
@@ -14,9 +16,6 @@ export default class GuestValidator {
])
})
public cacheKey = this.ctx.routeKey
public messages = {
required: 'Le champ {{field}} doit être valide !',
constructor (protected ctx: HttpContextContract) {
}
}

View File

@@ -1,4 +1,4 @@
import { HttpContextContract } from '@ioc:Adonis/Core/HttpContext'
import {HttpContextContract} from '@ioc:Adonis/Core/HttpContext'
import {schema} from '@ioc:Adonis/Core/Validator'
export default class LocationValidator {
@@ -14,6 +14,6 @@ export default class LocationValidator {
public cacheKey = this.ctx.routeKey
public messages = {
required: 'Le champ {{field}} doit être valide !',
required: 'The field {{field}} is required'
}
}

View File

@@ -0,0 +1,16 @@
import {schema} from '@ioc:Adonis/Core/Validator'
import {HttpContextContract} from '@ioc:Adonis/Core/HttpContext'
export default class ProfileUpdateValidator {
public schema = schema.create({
age: schema.number.optional(),
hiring_status: schema.string.optional(),
hiring_color: schema.string.optional()
})
public messages = {
required: 'The field {{field}} is required'
}
constructor (protected ctx: HttpContextContract) {
}
}

View File

@@ -0,0 +1,19 @@
import {schema} from '@ioc:Adonis/Core/Validator'
import {HttpContextContract} from '@ioc:Adonis/Core/HttpContext'
export default class ProjectStoreValidator {
constructor (protected ctx: HttpContextContract) {
}
public schema = schema.create({
name: schema.string(),
description: schema.string(),
progress: schema.number(),
url: schema.string(),
cover: schema.string()
})
public messages = {
required: 'The field {{field}} is required'
}
}

View File

@@ -0,0 +1,18 @@
import {schema} from '@ioc:Adonis/Core/Validator'
import {HttpContextContract} from '@ioc:Adonis/Core/HttpContext'
export default class ProjectUpdateValidator {
public schema = schema.create({
name: schema.string.optional(),
description: schema.string.optional(),
progress: schema.number.optional(),
url: schema.string.optional(),
cover: schema.string.optional()
})
public messages = {
required: 'The field {{field}} is required'
}
constructor (protected ctx: HttpContextContract) {
}
}

View File

@@ -1,19 +0,0 @@
import { schema } from '@ioc:Adonis/Core/Validator'
import { HttpContextContract } from '@ioc:Adonis/Core/HttpContext'
export default class ProjectValidator {
constructor (protected ctx: HttpContextContract) {
}
public schema = schema.create({
name: schema.string(),
description: schema.string(),
progress: schema.number(),
url: schema.string()
})
public messages = {
required: 'Le champ {{field}} doit être valide !',
}
}

View File

@@ -0,0 +1,20 @@
import {HttpContextContract} from '@ioc:Adonis/Core/HttpContext'
import {rules, schema} from '@ioc:Adonis/Core/Validator'
export default class SubscriberStoreValidator {
public schema = schema.create({
email: schema.string({ trim: true }, [
rules.email(),
rules.unique({
table: 'subscribers',
column: 'email'
})
])
})
public messages = {
required: 'The field {{field}} is required'
}
constructor (protected ctx: HttpContextContract) {
}
}

View File

@@ -1,19 +0,0 @@
import {HttpContextContract} from '@ioc:Adonis/Core/HttpContext'
import {rules, schema} from '@ioc:Adonis/Core/Validator'
export default class SubscriberValidator {
constructor (private ctx: HttpContextContract) {
}
public schema = schema.create({
email: schema.string({ trim: true }, [
rules.email()
])
})
public cacheKey = this.ctx.routeKey
public messages = {
required: 'Le champ {{field}} doit être valide !',
}
}

View File

@@ -0,0 +1,22 @@
import {rules, schema} from '@ioc:Adonis/Core/Validator'
import {HttpContextContract} from '@ioc:Adonis/Core/HttpContext'
export default class TranslationStoreValidator {
public schema = schema.create({
code: schema.string({}, [
rules.unique({
table: 'translations',
column: 'code'
})
]),
english: schema.string.optional(),
french: schema.string.optional()
})
public messages = {
required: 'The field {{field}} is required',
'code.unique': 'The translation code is not unique !'
}
constructor (protected ctx: HttpContextContract) {
}
}

View File

@@ -0,0 +1,22 @@
import {rules, schema} from '@ioc:Adonis/Core/Validator'
import {HttpContextContract} from '@ioc:Adonis/Core/HttpContext'
export default class TranslationUpdateValidator {
public schema = schema.create({
code: schema.string({}, [
rules.unique({
table: 'translations',
column: 'code'
})
]),
english: schema.string.optional(),
french: schema.string.optional()
})
public messages = {
required: 'The field {{field}} is required',
'code.unique': 'The translation code is not unique !'
}
constructor (protected ctx: HttpContextContract) {
}
}

View File

@@ -0,0 +1,23 @@
import {HttpContextContract} from '@ioc:Adonis/Core/HttpContext'
import {rules, schema} from '@ioc:Adonis/Core/Validator'
export default class UserStoreValidator {
public schema = schema.create({
email: schema.string({ trim: true, escape: true }, [
rules.email(),
rules.required(),
rules.unique({
table: 'users',
column: 'email'
})
])
})
public messages = {
required: 'The field {{field}} is required',
'email.email': 'The email must be valid',
'email.unique': 'The email is not unique'
}
constructor (protected ctx: HttpContextContract) {
}
}

View File

@@ -0,0 +1,33 @@
import {HttpContextContract} from '@ioc:Adonis/Core/HttpContext'
import {rules, schema} from '@ioc:Adonis/Core/Validator'
export default class UserUpdateValidator {
public schema = schema.create({
email: schema.string.optional({ trim: true, escape: true },
[
rules.email(),
rules.unique(
{
table: 'users',
column: 'email'
})
]
),
password: schema.string.optional({ trim: true, escape: true },
[
rules.confirmed()
]
),
is_confirmed: schema.boolean.optional(),
confirmation_token: schema.string.optional({ trim: true, escape: true }),
remember_me: schema.string.optional({ trim: true, escape: true }),
})
public messages = {
required: 'The field {{field}} is required',
'email.email': 'The email must be valid',
'password.confirmation': 'Passwords are not the same'
}
constructor (protected ctx: HttpContextContract) {
}
}

View File

@@ -1,22 +0,0 @@
import { HttpContextContract } from '@ioc:Adonis/Core/HttpContext'
import {rules, schema} from '@ioc:Adonis/Core/Validator'
export default class UserStoreValidator {
constructor (private ctx: HttpContextContract) {
}
public schema = schema.create({
email: schema.string({ trim: true, escape: true }, [
rules.email(),
rules.required(),
rules.unique({table: 'users', column: 'email'})
])
})
public cacheKey = this.ctx.routeKey
public messages = {
required: 'Le champ {{field}} doit être valide !',
'email.email': 'L\'adresse mail doit être valide !',
}
}

View File

@@ -1,25 +0,0 @@
import {HttpContextContract} from '@ioc:Adonis/Core/HttpContext'
import {rules, schema} from '@ioc:Adonis/Core/Validator'
export default class UserUpdateValidator {
constructor (private ctx: HttpContextContract) {
}
public schema = schema.create({
email: schema.string.optional({trim: true, escape: true}, [rules.email(), rules.unique({
table: 'users', column: 'email'
})]),
password: schema.string.optional({trim: true, escape: true}, [rules.confirmed()]),
is_confirmed: schema.boolean.optional(),
confirmation_token: schema.string.optional({trim: true, escape: true}),
remember_me: schema.string.optional({trim: true, escape: true}),
})
public cacheKey = this.ctx.routeKey
public messages = {
required: 'Le champ {{field}} doit être valide !',
'email.email': 'L\'adresse mail doit être valide !',
'password.confirmation': 'Les mots de passe ne correspondent pas !'
}
}

View File

@@ -24,7 +24,7 @@ const authConfig: AuthConfig = {
| Web Guard
|--------------------------------------------------------------------------
|
| Web guard uses classic old school sessions for authenticating users.
| Web guard uses classic old school sessions for authenticating user.
| If you are building a standard web application, it is recommended to
| use web guard with session driver
|
@@ -71,7 +71,7 @@ const authConfig: AuthConfig = {
| Model
|--------------------------------------------------------------------------
|
| The model to use for fetching or finding users. The model is imported
| The model to use for fetching or finding user. The model is imported
| lazily since the config files are read way earlier in the lifecycle
| of booting the app and the models may not be in a usable state at
| that time.
@@ -158,7 +158,7 @@ const authConfig: AuthConfig = {
| Model
|--------------------------------------------------------------------------
|
| The model to use for fetching or finding users. The model is imported
| The model to use for fetching or finding user. The model is imported
| lazily since the config files are read way earlier in the lifecycle
| of booting the app and the models may not be in a usable state at
| that time.

View File

@@ -5,7 +5,7 @@
* file.
*/
import { BodyParserConfig } from '@ioc:Adonis/Core/BodyParser'
import {BodyParserConfig} from '@ioc:Adonis/Core/BodyParser'
const bodyParserConfig: BodyParserConfig = {
/*
@@ -153,7 +153,7 @@ const bodyParserConfig: BodyParserConfig = {
| Convert empty strings to null
|--------------------------------------------------------------------------
|
| Convert empty form fields to null. HTML forms results in field string
| Convert empty form fields to null. HTML form results in field string
| value when the field is left blank. This option normalizes all the blank
| field values to "null"
|

View File

@@ -13,7 +13,7 @@ declare module '@ioc:Adonis/Addons/Auth' {
| Providers
|--------------------------------------------------------------------------
|
| The providers are used to fetch users. The Auth module comes pre-bundled
| The providers are used to fetch user. The Auth module comes pre-bundled
| with two providers that are `Lucid` and `Database`. Both uses database
| to fetch user details.
|
@@ -44,14 +44,14 @@ declare module '@ioc:Adonis/Addons/Auth' {
| Guards
|--------------------------------------------------------------------------
|
| The guards are used for authenticating users using different drivers.
| The guards are used for authenticating user using different drivers.
| The auth module comes with 3 different guards.
|
| - SessionGuardContract
| - BasicAuthGuardContract
| - OATGuardContract ( Opaque access token )
|
| Every guard needs a provider for looking up users from the database.
| Every guard needs a provider for looking up user from the database.
|
*/
interface GuardsList {

View File

@@ -9,7 +9,7 @@ export default class GuestbookMessages extends BaseSchema {
table
.integer('user_id')
.unsigned()
.references('users.id')
.references('user.id')
.onDelete('CASCADE')
table.text('message')
table.timestamps(true, true)

View File

@@ -1,7 +1,7 @@
import BaseSchema from '@ioc:Adonis/Lucid/Schema'
export default class Translations extends BaseSchema {
protected tableName = 'translations'
protected tableName = 'translation'
public async up () {
this.schema.createTable(this.tableName, (table) => {

View File

@@ -3,15 +3,21 @@ import Application from "@ioc:Adonis/Core/Application";
Route.group(() => {
Route.get('/discord', 'ProfileController.discord')
Route.post('/states/:state', 'StatesController.set')
Route.resource('/users', 'UsersController')
Route.post('/locations', 'LocationsController.store')
Route.post('/projects', 'ProjectsController.store')
Route.resource('/files', 'FileController').only(['store', 'destroy'])
Route.get('/me', 'ProfileController.me')
Route.resource('/users', 'UsersController').except(['edit', 'create'])
Route.resource('/translations', 'TranslationsController').except(['edit', 'create'])
Route.resource('/locations', 'LocationsController').only(['index', 'store'])
Route.resource('/files', 'FileController').only(['index', 'store', 'destroy'])
Route.group(() => {
Route.get('/', 'FileController.index')
Route.get('/:filename', async ({response, params}) => {
response.download(Application.makePath('storage', params.filename))
})
}).prefix('/files')
}).middleware('auth')

View File

@@ -1,16 +1,23 @@
import Route from "@ioc:Adonis/Core/Route";
Route.group(() => {
Route.post('/form', 'FormsController.send')
Route.resource('/form', 'FormsController').except(['edit', 'create', 'update'])
Route.resource('/announces', 'AnnouncesController').except(['edit', 'create'])
Route.resource('/projects', 'ProjectsController').except(['edit', 'create'])
Route.resource('/profile', 'ProfilesController').only(['index', 'update'])
Route.group(() => {
Route.get('/:slug', 'PostsController.getLikes')
Route.post('/:slug/like', 'PostsController.like')
Route.post('/:slug/unlike', 'PostsController.unlike')
}).prefix('/posts')
Route.get('/subscribers', 'SubscribersController.get')
Route.post('/subscribers', 'SubscribersController.store')
Route.delete('/subscribers', 'SubscribersController.delete')
Route.get('/guestbook', 'GuestBookController.index')
Route.post('/guestbook', 'GuestBookController.store')
Route.post('/guestbook/:email', 'GuestBookController.store')
Route.resource('/subscribers', 'SubscribersController').only(['index', 'store', 'destroy'])
Route.resource('/guestbook', 'GuestBookController').except(['edit', 'create', 'destroy'])
Route.get('/guestbook/:email', 'GuestBookController.exists')
}).middleware('auth')

View File

@@ -12,9 +12,8 @@ Route.get('/', async ({response}: HttpContextContract) => {
source: `${BASE_URL}/source`,
healthCheck: `${BASE_URL}/health`,
routes: {
profile: `${BASE_URL}/profile`,
profile: `${BASE_URL}/me`,
//stats: `${BASE_URL}/stats`,
states: `${BASE_URL}/states`,
locations: `${BASE_URL}/locations`,
projects: `${BASE_URL}/projects`
}
@@ -36,8 +35,4 @@ Route.get('/health', async ({response}: HttpContextContract) => {
})
})
Route.get('/profile', 'ProfileController.me')
Route.get('/locations', 'LocationsController.get')
Route.get('/stats', 'StatsController.get')
Route.get('/states', 'StatesController.get')
Route.get('/projects', 'ProjectsController.get')