# Firestore Patterns

> 🔥 Firestore Patterns

- Skill: `vuralserhat86/firestore-patterns` (Agent Skill)
- Install (CLI): `npx skillmds@latest add vuralserhat86/firestore-patterns`
- Raw SKILL.md: https://api.skillmd.com/api/skills/vuralserhat86/firestore-patterns/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: vuralserhat86 (https://skillmd.com/u/vuralserhat86)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/vuralserhat86/firestore-patterns

---


# 🔥 Firestore Patterns

> Firebase Firestore NoSQL patterns rehberi.

---

## 📋 Temel İşlemler

```typescript
import { 
  collection, doc, getDoc, setDoc, 
  addDoc, updateDoc, deleteDoc, query, where 
} from 'firebase/firestore';

// Read
const docRef = doc(db, 'users', 'userId');
const docSnap = await getDoc(docRef);

// Create
await setDoc(doc(db, 'users', 'userId'), { name: 'John' });
await addDoc(collection(db, 'users'), { name: 'John' }); // Auto ID

// Update
await updateDoc(doc(db, 'users', 'userId'), { name: 'Jane' });

// Delete
await deleteDoc(doc(db, 'users', 'userId'));
```

---

## 🔄 Real-time Listeners

```typescript
import { onSnapshot } from 'firebase/firestore';

const unsubscribe = onSnapshot(
  doc(db, 'users', 'userId'),
  (doc) => {
    console.log('Data:', doc.data());
  }
);

// Cleanup
unsubscribe();
```

---

## 🔍 Queries

```typescript
const q = query(
  collection(db, 'users'),
  where('age', '>=', 18),
  where('status', '==', 'active'),
  orderBy('createdAt', 'desc'),
  limit(10)
);

const querySnapshot = await getDocs(q);
```

---

## 🔒 Security Rules

```javascript
rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /users/{userId} {
      allow read: if request.auth != null;
      allow write: if request.auth.uid == userId;
    }
  }
}
```

---

*Firestore Patterns v1.1 - Enhanced*

## 🔄 Workflow

> **Kaynak:** [Firebase Security Rules Guide](https://firebase.google.com/docs/firestore/security/get-started)

### Aşama 1: Data Modeling
- [ ] **Access Patterns**: Veriyi nasıl okuyacağına göre modelle (SQL gibi normalize etme).
- [ ] **Subcollections**: 1MB döküman limitini aşmamak için alt koleksiyon kullan.
- [ ] **Denormalization**: Okuma performansını artırmak için veriyi çoğaltmayı düşün.

### Aşama 2: Security Implementation
- [ ] **Auth**: `request.auth != null` kontrolünü her kurala ekle.
- [ ] **Validation**: Gelen veriyi (type, length) security rules içinde doğrula.
- [ ] **Testing**: Emulator kullanarak kuralları unit test ile sına.

### Aşama 3: Optimization
- [ ] **Indexes**: Karmaşık sorgular için composite index oluştur.
- [ ] **Offline**: Mobil için offline persistence'ı aktif et.

### Kontrol Noktaları
| Aşama | Doğrulama |
|-------|-----------|
| 1 | Bir dökümanı okumak için 100 başka döküman okumak gerekiyor mu? (Kötü) |
| 2 | Herkesin yazabildiği (`allow write: if true`) bir yer kaldı mı? (Kritik) |
| 3 | Sorgular index hatası veriyor mu? |

