feat: add create/edit link form + controller methods

This commit is contained in:
Sonny
2024-05-18 00:55:27 +02:00
committed by Sonny
parent 8176817030
commit 3c2c5dcee6
23 changed files with 421 additions and 147 deletions

View File

@@ -62,18 +62,6 @@ export default class CollectionsController {
});
}
/**
* Get collection by id.
*
* /!\ Only return private collection (create by the current user)
*/
async getCollectionById(id: Collection['id'], userId: User['id']) {
return await Collection.query()
.where('id', id)
.andWhere('author_id', userId)
.firstOrFail();
}
async update({ request, auth, response }: HttpContext) {
const { params, ...payload } = await request.validateUsing(
updateCollectionValidator
@@ -94,6 +82,18 @@ export default class CollectionsController {
return this.redirectToCollectionId(response, params.id);
}
/**
* Get collection by id.
*
* /!\ Only return private collection (create by the current user)
*/
async getCollectionById(id: Collection['id'], userId: User['id']) {
return await Collection.query()
.where('id', id)
.andWhere('author_id', userId)
.firstOrFail();
}
async getCollectionsByAuthorId(authorId: User['id']) {
return await Collection.query()
.where('author_id', authorId)

View File

@@ -1,6 +1,10 @@
import CollectionsController from '#controllers/collections_controller';
import Link from '#models/link';
import { linkValidator } from '#validators/link';
import {
createLinkValidator,
updateLinkFavoriteStatusValidator,
updateLinkValidator,
} from '#validators/link';
import { inject } from '@adonisjs/core';
import type { HttpContext } from '@adonisjs/core/http';
@@ -16,7 +20,7 @@ export default class LinksController {
async store({ auth, request, response }: HttpContext) {
const { collectionId, ...payload } =
await request.validateUsing(linkValidator);
await request.validateUsing(createLinkValidator);
await this.collectionsController.getCollectionById(
collectionId,
@@ -32,4 +36,67 @@ export default class LinksController {
collectionId
);
}
async showEditPage({ auth, inertia, request, response }: HttpContext) {
const linkId = request.qs()?.linkId;
if (!linkId) {
return response.redirectToNamedRoute('dashboard');
}
const userId = auth.user!.id;
const collections =
await this.collectionsController.getCollectionsByAuthorId(userId);
const link = await this.getLinkById(linkId, userId);
return inertia.render('links/edit', { collections, link });
}
async update({ request, auth, response }: HttpContext) {
const { params, ...payload } =
await request.validateUsing(updateLinkValidator);
// Throw if invalid link id provided
await this.getLinkById(params.id, auth.user!.id);
await Link.updateOrCreate(
{
id: params.id,
},
payload
);
return response.redirectToNamedRoute('dashboard', {
qs: { collectionId: payload.collectionId },
});
}
async toggleFavorite({ request, auth, response }: HttpContext) {
const { params, favorite } = await request.validateUsing(
updateLinkFavoriteStatusValidator
);
// Throw if invalid link id provided
await this.getLinkById(params.id, auth.user!.id);
await Link.updateOrCreate(
{
id: params.id,
},
{ favorite }
);
return response.json({ status: 'ok' });
}
/**
* Get link by id.
*
* /!\ Only return private link (create by the current user)
*/
private async getLinkById(id: Link['id'], userId: Link['id']) {
return await Link.query()
.where('id', id)
.andWhere('author_id', userId)
.firstOrFail();
}
}

View File

@@ -1,6 +1,6 @@
import vine from '@vinejs/vine';
export const linkValidator = vine.compile(
export const createLinkValidator = vine.compile(
vine.object({
name: vine.string().trim().minLength(1).maxLength(254),
description: vine.string().trim().maxLength(300).optional(),
@@ -9,3 +9,27 @@ export const linkValidator = vine.compile(
collectionId: vine.string().trim(),
})
);
export const updateLinkValidator = vine.compile(
vine.object({
name: vine.string().trim().minLength(1).maxLength(254),
description: vine.string().trim().maxLength(300).optional(),
url: vine.string().trim(),
favorite: vine.boolean(),
collectionId: vine.string().trim(),
params: vine.object({
id: vine.string().trim(),
}),
})
);
export const updateLinkFavoriteStatusValidator = vine.compile(
vine.object({
favorite: vine.boolean(),
params: vine.object({
id: vine.string().trim(),
}),
})
);