Legal documents overview — RTK Query migration
Legal overview ve zorunlu doküman kuralları mobil
React Native RTK Query Migration - Legal Overview
Migration rehberi
Yapılandırma sırası için Migration şablonu. Yeni düzenlemelerde Amaç → Önkoşullar → Endpoint → Request/Response → Hata kodları → Client adımları → İlgili sayfalar bölümlerini tercih edin.
Bu doküman, legal-documents/overview tarafında yapılan yeni migration için React Native + RTK Query entegrasyonunda yapılması gereken değişiklikleri anlatır.
1) Neden bu migration?
Backend tarafında legal overview mantigi güncellendi:
payment_termsvepurchase_termsartık onboarding core alanlarini overwrite etmez.- Overview cevabina
additionalDocumentsalani eklendi. - Dokumanlarin zorunluluk durumu artık yonetilebilir:
- Dokuman modelinde
isRequiredInOverviewvar. - Overview item seviyesinde
isRequireddonuyor.
- Dokuman modelinde
requiredDocuments,allConsentsGiven,needsConsentsadeceisRequired === trueolan dokümanlara gore hesaplanır.
Bu değişiklik, mobil tarafta "tüm legal dokümanlar zorunlu" algısını kaldırmak için gereklidir.
2) Backend contract ozeti
2.1 GET /legal-documents/overview
Yeni/degisen alanlar:
privacyPolicy(core)termsOfUse(core)consentForm(core)additionalDocuments: DocumentOverviewDetail[](yeni)requiredDocuments: DocumentType[]allConsentsGiven: booleanneedsConsent: booleancurrentVersions: Partial<Record<DocumentType, string>>
DocumentOverviewDetail:
typetitleversionhasUserConsenteduserConsentDateneedsUpdateisRequired
2.2 GET /legal-documents/active
Legal document item response artık:
isRequiredInOverview: booleanalanini da icerir.
Not:
- Onboarding step-7 backend dogrulamasi bu migrationda degismedi.
- Step-7 halen
privacyPolicy,termsOfUse,consentFormpayload yapisiyla calisir.
3) Mobil type değişiklikleri
Ornek type seti:
export type DocumentType =
| 'privacy_policy'
| 'terms_of_use'
| 'consent_form'
| 'payment_terms'
| 'purchase_terms';
export type DocumentOverviewDetail = {
type: DocumentType;
title: string;
version: string;
hasUserConsented: boolean;
userConsentDate?: string;
needsUpdate: boolean;
isRequired: boolean;
};
export type LegalOverviewResponse = {
privacyPolicy: DocumentOverviewDetail;
termsOfUse: DocumentOverviewDetail;
consentForm: DocumentOverviewDetail;
additionalDocuments: DocumentOverviewDetail[];
allConsentsGiven: boolean;
needsConsent: boolean;
requiredDocuments: DocumentType[];
currentVersions: Partial<Record<DocumentType, string>>;
};
export type ActiveLegalDocument = {
_id: string;
type: DocumentType;
version: string;
title: string;
content: string;
language: string;
isActive: boolean;
isRequiredInOverview: boolean;
effectiveDate?: string;
createdAt?: string;
updatedAt?: string;
};4) RTK Query endpoint guncellemeleri
Ornek API slice:
import { baseApi } from './baseApi';
type BaseResponseDto<T> = {
isSuccess: boolean;
statusCode: number;
data: T;
errors?: string[];
timestamp: string;
};
const unwrap = <T>(response: BaseResponseDto<T> | T): T => {
if (response && typeof response === 'object' && 'data' in (response as any)) {
return (response as BaseResponseDto<T>).data;
}
return response as T;
};
export const legalDocumentsApi = baseApi.injectEndpoints({
endpoints: (builder) => ({
getLegalOverview: builder.query<LegalOverviewResponse, void>({
query: () => ({ url: '/legal-documents/overview' }),
transformResponse: (response: BaseResponseDto<LegalOverviewResponse> | LegalOverviewResponse) => {
const data = unwrap(response);
return {
...data,
additionalDocuments: data.additionalDocuments ?? [],
};
},
providesTags: [{ type: 'LegalDocuments', id: 'OVERVIEW' }],
}),
getActiveLegalDocuments: builder.query<ActiveLegalDocument[], { language?: string } | void>({
query: (params) => ({
url: '/legal-documents/active',
params,
}),
transformResponse: (response: BaseResponseDto<ActiveLegalDocument[]> | ActiveLegalDocument[]) => {
const data = unwrap(response);
return data.map((doc) => ({
...doc,
isRequiredInOverview: typeof doc.isRequiredInOverview === 'boolean'
? doc.isRequiredInOverview
: ['privacy_policy', 'terms_of_use', 'consent_form'].includes(doc.type),
}));
},
providesTags: [{ type: 'LegalDocuments', id: 'ACTIVE' }],
}),
}),
});5) UI veri akisi değişiklikleri
Onerilen mantik:
getLegalOverviewile core + additional dokümanları çek.- UI listesi:
- Core:
privacyPolicy,termsOfUse,consentForm - Additional:
additionalDocuments
- Core:
- Dokuman rozetleri:
isRequired === true-> "Zorunlu"isRequired === false-> "Opsiyonel"
- CTA / tamamlanma kontrolu:
- Overview bazli zorunluluk için
requiredDocumentskullan. - Onboarding step-7 payloadinda yalnızcaca core 3 alan gönder.
- Overview bazli zorunluluk için
6) Step-7 ile uyumluluk notu (kritik)
Bu migrationda backend step-7 dogrulamasi degismedigi için:
POST /onboarding/step-7payloadi ayni kalmali:privacyPolicytermsOfUseconsentForm
additionalDocumentsstep-7 payloadina eklenmemeli.
Opsiyonel/ek doküman consent kaydi gerektiginde POST /legal-documents/consent endpointi ayrica kullanilabilir.
7) Backward compatibility fallback kurallari
Gecis suresince eski backend response gelebilir. Mobilde fallback ekleyin:
additionalDocumentsyoksa:[]isRequiredInOverviewyoksa:privacy_policy,terms_of_use,consent_form->truepayment_terms,purchase_terms->false
Bu fallback, kademeli deploy surecinde ekran kirilmasini onler.
8) Test checklist (mobil)
En az su senaryolari test edin:
- Core 3 doküman zorunlu, additional dokümanlar opsiyonel görünüyor.
consentFormkarti artıkpayment/purchaseile karismiyor.requiredDocumentssadece gerekli doküman tiplerini iceriyor.allConsentsGivenveneedsConsentdegerleri UI durumuyla tutarli.- Eski response simulasyonunda (
additionalDocumentsabsent) fallback dogru calisiyor. - Step-7 submit hala sadece 3 core consent ile basarili.
9) Rollout sirasi (onerilen)
- Mobil type + RTK Query transform/fallback kodunu ekle.
- UI'da
additionalDocumentsrender et ve required rozetiniisRequiredile belirle. - QA checklist ile dogrula.
- Ardindan production release.