Improving Error Handling in TypeScript: Converting `getCurrentCompany` Function to Use Effects

Hi all, I am trying to learn effect by converting existing code, but improving error handling,
export async function getCurrentCompany(): Promise<Company> {
  const session = await auth();
  if (!session?.companyId) throw new Error('Invalid session');

  const company = (await db
    .query('SELECT * FROM "company" WHERE "id" = $1', [session.companyId])
    .then((res) => res.rows.map(convertToCamelCase)[0])) as Company | null;
  if (!company) throw new Error('Invalid data');

  return company;
}

export const getCurrentCompany = () : Effect.Effect<Company, InvalidSession | InvalidUser> => Effect.gen(function* () {
    const session = yield* Effect.promise(async () => await auth());
    if(!session?.companyId) return Effect.fail(new InvalidSession());

    const companyUnknown = yield* Effect.promise(async () => await db
    .query('SELECT * FROM "company" WHERE "id" = $1', [session.companyId])
    .then((res) => res.rows.map(convertToCamelCase)[0]));

    if(!companyUnknown) return Effect.fail(new InvalidUser());

    const company = Schema.decodeUnknownSync(Company)(companyUnknown);

    return Effect.succeed(company);
  }).pipe(Effect.runPromise);

I'm not convinced about what I did, but if it works
Was this page helpful?