DEV Community

Santhanam Elumalai
Santhanam Elumalai

Posted on • Edited on

Building a Robust API Layer - Implementation with `api-def` Package

Continuing our series, let's delve into the practical implementation using the api-def package.

Recap:

  • We explored the concept of the api-def package in the previous post.
  • It centralizes API definitions and provides a consistent interface for making API requests.

Implementation Breakdown (Part 1: api-def-package Setup)

Project Setup:

  • Existing Project: Assuming you've bootstrapped your application based on the previous post Bootstrapping With Turbo Repo.

  • Dependencies: Install the required packages using npm or yarn:

     npm install @zodios/core zod typescript axios eslint
    

API Definition:

  • Create a folder named user under src to store API definitions specific to user data.

  • Define the API schema using Zod:

     import { z } from "zod";
    
     export const UserProfileSchema = z.object({
       firstName: z.string(),
       lastName: z.string(),
       email: z.string().email(),
     });
    
     export const Users = z.array(UserProfileSchema);
    
     export const UserSchema = {
       UserProfileSchema,
       Users,
     };
    
  • Create separate files for types and query keys for better organization.

API Endpoint:

  • Use Zodios to create the API endpoint for fetching users:

     import { makeEndpoint } from "@zodios/core";
     import { UserSchema } from "./user-schema";
    
     export const getUsers = makeEndpoint({
       method: "post",
       path: "user/search",
       alias: "getUsers",
       parameters: [
         {
           type: "Body",
           name: "getUsersPayload",
           schema: UserSchema.UserProfileSchema.partial(),
         },
       ],
       response: UserSchema.Users,
     });
    

Query Key:

  • Define a method to generate query keys for caching and invalidation:

     import { User } from "./user-type";
    
     export const GetUserKeys = {
       getUsers: (requestBody: Partial<User.UserProfile>) => {
         return [
           {
             requestBody,
           },
         ];
       },
     };
    

API Client:

  • Create an API client using Zodios to make API calls based on the defined endpoint:

     import { Zodios, makeApi } from "@zodios/core";
     import { getUsers } from "./user/user-endpoint";
    
     const api = makeApi([getUsers]);
     export const ApiClient = new Zodios("http://localhost:3000/api/", api);
    

Export:

  • Export all the components (schemas, types, query keys, API client) from a central index file:

     export * from "./queryKey";
     export * from "./schemas";
     export * from "./types";
     export * from "./apiclient";
    

This completes the implementation of the api-def package. In the next part, we'll demonstrate how to integrate this package with a Next.js application for client-side and server-side API fetching.

Github PR Location

Stay tuned for the next post!

Top comments (0)

AWS Security LIVE!

Tune in for AWS Security LIVE!

Join AWS Security LIVE! for expert insights and actionable tips to protect your organization and keep security teams prepared.

Learn More