RTK Query & Server State Management Skill
Purpose
Standardize server state management, caching, tag invalidation, and request header generation using RTK Query (createApi).
1. Rules of Engagement
MANDATORY
- Use RTK Query (
createApi) exclusively for server state data fetching and mutations.
- Tag Ownership & Circular Dependency Prevention: Define tag constants in dedicated tag registry modules (e.g.,
src/services/tags/transactionTags.ts) rather than importing API slice files into each other.
- Idempotency Header Generation: For state-mutating requests (
POST, PUT, DELETE), pass X-Idempotency-Key headers generated per logical operation (crypto.randomUUID()).
2. Shared Tag Registry & API Slice Pattern
// src/services/tags/transactionTags.ts
export const TRANSACTION_TAGS = {
LIST: 'TransactionList' as const,
DETAIL: 'TransactionDetail' as const,
};
// src/services/api/transactionApi.ts
import { createApi, fetchBaseQuery } from '@reduxjs/toolkit/query/react';
import { TRANSACTION_TAGS } from '../tags/transactionTags';
export const transactionApi = createApi({
reducerPath: 'transactionApi',
baseQuery: fetchBaseQuery({ baseUrl: '/api/v1' }),
tagTypes: Object.values(TRANSACTION_TAGS),
endpoints: (builder) => ({
getTransactions: builder.query({
query: (params) => `/transactions?page=${params.page}&size=${params.size}`,
providesTags: [TRANSACTION_TAGS.LIST],
}),
createTransaction: builder.mutation({
query: ({ body, idempotencyKey }) => ({
url: '/transactions',
method: 'POST',
headers: { 'X-Idempotency-Key': idempotencyKey },
body,
}),
invalidatesTags: [TRANSACTION_TAGS.LIST],
}),
}),
});
1---2name: rtk-query3description: Use when building Redux Toolkit & RTK Query API slices, tag invalidation, caching, and server state management.4---56# RTK Query & Server State Management Skill78## Purpose9Standardize server state management, caching, tag invalidation, and request header generation using RTK Query (`createApi`).1011---1213## 1. Rules of Engagement1415### MANDATORY16- Use RTK Query (`createApi`) exclusively for server state data fetching and mutations.17- **Tag Ownership & Circular Dependency Prevention**: Define tag constants in dedicated tag registry modules (e.g., `src/services/tags/transactionTags.ts`) rather than importing API slice files into each other.18- **Idempotency Header Generation**: For state-mutating requests (`POST`, `PUT`, `DELETE`), pass `X-Idempotency-Key` headers generated per logical operation (`crypto.randomUUID()`).1920---2122## 2. Shared Tag Registry & API Slice Pattern2324```typescript25// src/services/tags/transactionTags.ts26export const TRANSACTION_TAGS = {27 LIST: 'TransactionList' as const,28 DETAIL: 'TransactionDetail' as const,29};3031// src/services/api/transactionApi.ts32import { createApi, fetchBaseQuery } from '@reduxjs/toolkit/query/react';33import { TRANSACTION_TAGS } from '../tags/transactionTags';3435export const transactionApi = createApi({36 reducerPath: 'transactionApi',37 baseQuery: fetchBaseQuery({ baseUrl: '/api/v1' }),38 tagTypes: Object.values(TRANSACTION_TAGS),39 endpoints: (builder) => ({40 getTransactions: builder.query({41 query: (params) => `/transactions?page=${params.page}&size=${params.size}`,42 providesTags: [TRANSACTION_TAGS.LIST],43 }),44 createTransaction: builder.mutation({45 query: ({ body, idempotencyKey }) => ({46 url: '/transactions',47 method: 'POST',48 headers: { 'X-Idempotency-Key': idempotencyKey },49 body,50 }),51 invalidatesTags: [TRANSACTION_TAGS.LIST],52 }),53 }),54});55```