Advertisement
Guest User

API Service example

a guest
Jan 5th, 2025
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // api.ts
  2. import axios, { AxiosInstance, AxiosResponse } from "axios";
  3.  
  4. interface User {
  5.   id: number;
  6.   name: string;
  7.   email: string;
  8. }
  9.  
  10. interface Post {
  11.   id: number;
  12.   userId: number;
  13.   title: string;
  14.   body: string;
  15. }
  16.  
  17. interface ApiResponse<T> {
  18.   data: T | null;
  19.   error: string | null;
  20.   success: boolean;
  21. }
  22.  
  23. interface TokenResponse {
  24.   token: string;
  25.   refreshToken: string;
  26.   expiresIn: number; // Token expiration in seconds
  27. }
  28.  
  29. interface IApiService {
  30.   getUsers(): Promise<ApiResponse<User[]>>;
  31.   getUser(id: number): Promise<ApiResponse<User>>;
  32.   getPosts(): Promise<ApiResponse<Post[]>>;
  33.   createPost(title: string, body: string): Promise<ApiResponse<Post>>;
  34.   authenticate(username: string, password: string): Promise<ApiResponse<void>>;
  35. }
  36.  
  37. // Simple in-memory storage for tokens (replace with a persistent storage in a real application)
  38. let storedToken: string | null = null;
  39. let storedRefreshToken: string | null = null;
  40. let tokenExpiration: number | null = null;
  41.  
  42. class ApiService implements IApiService {
  43.   private api: AxiosInstance;
  44.   private baseURL: string; // Store base URL
  45.  
  46.   constructor(baseURL: string) {
  47.     this.baseURL = baseURL;
  48.     this.api = axios.create({
  49.       baseURL: baseURL,
  50.       headers: {
  51.         "Content-Type": "application/json",
  52.       },
  53.     });
  54.     this.api.interceptors.request.use(async (config) => {
  55.       const token = await this.getToken(); // Get token from storage
  56.       if (token) {
  57.         config.headers.Authorization = `Bearer ${token}`;
  58.       }
  59.       return config;
  60.     });
  61.   }
  62.  
  63.   private async getToken(): Promise<string | null> {
  64.     if (storedToken && tokenExpiration && Date.now() < tokenExpiration * 1000) {
  65.       // Token is still valid, return it
  66.       return storedToken;
  67.     }
  68.  
  69.     if (storedRefreshToken) {
  70.       const refreshResult = await this.refreshAccessToken();
  71.       if (refreshResult.success) {
  72.         return storedToken;
  73.       }
  74.     }
  75.     return null; // No valid token, need to authenticate
  76.   }
  77.  
  78.   private async refreshAccessToken(): Promise<ApiResponse<void>> {
  79.     try {
  80.       if (!storedRefreshToken) {
  81.         return {
  82.           data: null,
  83.           error: "No refresh token available",
  84.           success: false,
  85.         };
  86.       }
  87.       const refreshResponse: AxiosResponse<TokenResponse> = await this.api.post(
  88.         "/auth/refresh", // Refresh token endpoint (adjust to your API)
  89.         { refreshToken: storedRefreshToken }
  90.       );
  91.       const { token, refreshToken, expiresIn } = refreshResponse.data;
  92.       this.setTokenData(token, refreshToken, expiresIn);
  93.       return { data: null, error: null, success: true };
  94.     } catch (error: any) {
  95.       this.clearTokenData(); // clear token and refresh token because refresh token is invalid
  96.       return { data: null, error: error.message, success: false };
  97.     }
  98.   }
  99.  
  100.   async authenticate(
  101.     username: string,
  102.     password: string
  103.   ): Promise<ApiResponse<void>> {
  104.     try {
  105.       const authResponse: AxiosResponse<TokenResponse> = await this.api.post(
  106.         "/auth/login",
  107.         {
  108.           username,
  109.           password,
  110.         }
  111.       );
  112.  
  113.       const { token, refreshToken, expiresIn } = authResponse.data;
  114.       this.setTokenData(token, refreshToken, expiresIn);
  115.       return { data: null, error: null, success: true };
  116.     } catch (error: any) {
  117.       return { data: null, error: error.message, success: false };
  118.     }
  119.   }
  120.  
  121.   private setTokenData(token: string, refreshToken: string, expiresIn: number) {
  122.     storedToken = token;
  123.     storedRefreshToken = refreshToken;
  124.     tokenExpiration = Date.now() / 1000 + expiresIn;
  125.   }
  126.  
  127.   private clearTokenData() {
  128.     storedToken = null;
  129.     storedRefreshToken = null;
  130.     tokenExpiration = null;
  131.   }
  132.  
  133.   async getUsers(): Promise<ApiResponse<User[]>> {
  134.     try {
  135.       const response: AxiosResponse<User[]> = await this.api.get("/users");
  136.       return { data: response.data, error: null, success: true };
  137.     } catch (error: any) {
  138.       return { data: null, error: error.message, success: false };
  139.     }
  140.   }
  141.  
  142.   async getUser(id: number): Promise<ApiResponse<User>> {
  143.     try {
  144.       const response: AxiosResponse<User> = await this.api.get(`/users/${id}`);
  145.       return { data: response.data, error: null, success: true };
  146.     } catch (error: any) {
  147.       return { data: null, error: error.message, success: false };
  148.     }
  149.   }
  150.  
  151.   async getPosts(): Promise<ApiResponse<Post[]>> {
  152.     try {
  153.       const response: AxiosResponse<Post[]> = await this.api.get("/posts");
  154.       return { data: response.data, error: null, success: true };
  155.     } catch (error: any) {
  156.       return { data: null, error: error.message, success: false };
  157.     }
  158.   }
  159.  
  160.   async createPost(title: string, body: string): Promise<ApiResponse<Post>> {
  161.     try {
  162.       const response: AxiosResponse<Post> = await this.api.post("/posts", {
  163.         title,
  164.         body,
  165.       });
  166.       return { data: response.data, error: null, success: true };
  167.     } catch (error: any) {
  168.       return { data: null, error: error.message, success: false };
  169.     }
  170.   }
  171. }
  172.  
  173. export { ApiService, IApiService, ApiResponse };
  174.  
  175. // test_api.ts
  176.  
  177. import { ApiService, IApiService, ApiResponse } from "./api";
  178.  
  179. const baseURL = "https://your-api-url.com"; // Replace with your actual API endpoint
  180. const apiService: IApiService = new ApiService(baseURL);
  181.  
  182. async function testApi() {
  183.   //Authenticate the user
  184.   const authResponse = await apiService.authenticate(
  185.     "your_username",
  186.     "your_password"
  187.   );
  188.  
  189.   if (authResponse.success) {
  190.     console.log("Authentication successful!");
  191.  
  192.     //Get Users
  193.     const usersResponse: ApiResponse<any> = await apiService.getUsers();
  194.     if (usersResponse.success && usersResponse.data) {
  195.       console.log("Users:", usersResponse.data);
  196.     } else if (usersResponse.error) {
  197.       console.error("Error getting users", usersResponse.error);
  198.     }
  199.  
  200.     //Get a user
  201.     const userResponse: ApiResponse<any> = await apiService.getUser(1);
  202.     if (userResponse.success && userResponse.data) {
  203.       console.log("User:", userResponse.data);
  204.     } else if (userResponse.error) {
  205.       console.error("Error getting user", userResponse.error);
  206.     }
  207.  
  208.     //Get Posts
  209.     const postsResponse: ApiResponse<any> = await apiService.getPosts();
  210.     if (postsResponse.success && postsResponse.data) {
  211.       console.log("Posts:", postsResponse.data);
  212.     } else if (postsResponse.error) {
  213.       console.error("Error getting posts", postsResponse.error);
  214.     }
  215.  
  216.     // Create a Post
  217.     const createPostResponse: ApiResponse<any> = await apiService.createPost(
  218.       "My new title",
  219.       "My new Body"
  220.     );
  221.     if (createPostResponse.success && createPostResponse.data) {
  222.       console.log("New Post created:", createPostResponse.data);
  223.     } else if (createPostResponse.error) {
  224.       console.error("Error creating a post", createPostResponse.error);
  225.     }
  226.   } else {
  227.     console.error("Authentication failed:", authResponse.error);
  228.   }
  229. }
  230.  
  231. testApi();
  232.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement