const Item =entity('Item', {id: id(Number),isDone: field(Boolean, {default: false}),description: field(String, {validation: { presence: true, length: { minimum: 3 } }})})const TodoList =entity('To Do List', {id: id(Number),name: field(String),items: field([Item])isDone() {return this.items.length === this.items.filter(i => i.isDone).length}})
const CreateList =usecase('Create List', {// Input fields and typesrequest: { name: String },// Output typeresponse: TodoList,// Authorization check and auditauthorize: async (user) => (user.canCreateList ? Ok() : Err()),// Steps description and audit'Check if the List is valid': step(ctx => {const list = ctx.list = new TodoList()list.id = Math.random()list.name = ctx.req.nameif (!list.isValid()) return Err(list.errors)return Ok()}),'Save the List': step(async ctx => {const listRepo = new ctx.di.ListRepository(injection)return (ctx.ret = await listRepo.insert(ctx.list))}),})