Skip to content

Instantly share code, notes, and snippets.

@brandonchadlange
brandonchadlange / api-route-with-handler.ts
Created November 3, 2022 20:10
Usage of the RouteHandler method
import RouteHandler from './route-handler';
export default RouteHandler({
GET(req, res) {
// get logic goes in here
},
POST(req, res) {
// post logic goes in here
}
});
@brandonchadlange
brandonchadlange / route-handler.ts
Created November 3, 2022 20:01
Next.js route handler for better method safety
import type { NextApiRequest, NextApiResponse } from "next";
type HttpMethod = "GET" | "POST" | "PUT" | "DELETE";
type HttpHandler = (request: NextApiRequest, response: NextApiResponse) => void;
interface RouteHandlerParams {
GET?: HttpHandler;
POST?: HttpHandler;
PUT?: HttpHandler;
DELETE?: HttpHandler;
@brandonchadlange
brandonchadlange / events.service.ts
Created October 17, 2022 05:59
A service to create and fire events
import { Injectable } from '@nestjs/common';
import { PrismaService } from 'src/prisma.service';
import { EventCreateDTO } from '../dto/event-create.dto';
import { OnEvent, EventEmitter2 } from '@nestjs/event-emitter';
import { EventTriggeredEvent } from '../events/event-triggered.event';
import { HttpService } from '@nestjs/axios';
@Injectable()
export class EventService {
constructor(
@brandonchadlange
brandonchadlange / schema.prisma
Last active October 13, 2022 07:04
Event service models
model Event {
id Int @id @default(autoincrement())
name String
actions Action[]
}
model Action {
id Int @id @default(autoincrement())
name String
endpoint String
@brandonchadlange
brandonchadlange / crud-route-handlert.ts
Created October 10, 2022 20:57
A route handler that uses a CRUD service to quickly map and handle requests
import type { NextApiRequest, NextApiResponse } from "next";
type HttpMethod = "GET" | "POST" | "PUT" | "DELETE";
export const CrudRouteHandler = async <T>(
request: NextApiRequest,
response: NextApiResponse,
service: ICrudService<T>
) => {
const id = request.query.id as string;
@brandonchadlange
brandonchadlange / crud-service-interface
Created October 10, 2022 20:55
A simple interface for defining CRUD services
export interface ICrudService<T> {
getAll: () => Promise<T[]>;
getOne: (id: string) => Promise<T | null>;
create: (data: T) => Promise<T>;
update: (id: string, data: T) => Promise<T>;
delete: (id: string) => Promise<T>;
}
@brandonchadlange
brandonchadlange / todos.tsx
Created October 3, 2022 20:54
Todos full implementation
interface Todo {
description: string;
complete: boolean;
}
const useTodoListViewModel = () => {
const [todos, setTodos] = useState<Todo[]>([]);
const createTodo = (description: string) => {
const newTodo: Todo = {
@brandonchadlange
brandonchadlange / todos.tsx
Created October 3, 2022 20:49
Todo view model implementation
const Todos = () => {
const listVm = useTodoListViewModel();
const addTodoVm = useAddTodoVm(listVm.createTodo);
return (
<>
<TodoList todos={listVm.todos} />
<AddTodo viewModel={addTodoVm} />
</>
);
@brandonchadlange
brandonchadlange / add-todo.tsx
Created October 3, 2022 20:46
Example add todo view model
const useAddTodoVm = (onAdd: (description: string) => void) => {
const [inputText, setInputText] = useState("");
const addTodo = () => {
onAdd(inputText);
setInputText("");
};
return {
inputText,
@brandonchadlange
brandonchadlange / todo-list.tsx
Created October 3, 2022 20:42
Example Todo list view model
const useTodoListViewModel = () => {
const [todos, setTodos] = useState<Todo[]>([]);
const createTodo = (description: string) => {
const newTodo: Todo = {
description,
complete: false,
};
setTodos((current) => [...current, newTodo]);