{"_id":"@alicanyucelankara06/generic-service","name":"@alicanyucelankara06/generic-service","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"name":"@alicanyucelankara06/generic-service","version":"1.0.0","description":"Angular 21 Generic CRUD Service Package","license":"MIT","peerDependencies":{"@angular/common":"^21.0.0","@angular/core":"^21.0.0","rxjs":"^7.8.0"},"devDependencies":{"@angular/common":"^21.0.0","@angular/compiler":"^21.0.0","@angular/compiler-cli":"^21.0.0","@angular/core":"^21.0.0","@angular/platform-browser":"^21.0.0","ng-packagr":"^21.0.0","rxjs":"^7.8.0","typescript":"~5.9.0","zone.js":"~0.15.0"},"scripts":{"build":"ng-packagr -p ng-package.json","build:watch":"ng-packagr -p ng-package.json --watch"},"sideEffects":false,"_id":"@alicanyucelankara06/generic-service@1.0.0","gitHead":"29643553ec05d918b2c724305ac9edde5c3ab4ef","_nodeVersion":"24.14.0","_npmVersion":"10.9.2","dist":{"integrity":"sha512-oTflOOIP7r1DXC+YP0TaP0b2hug6O5NGLPv/QxpSsA42ReSv5VTPHTe2xTyNF1wu91U9iJls8kP70nFufuDNTA==","shasum":"1cb9568b9693abccc6962bd92540b0225a057198","tarball":"https://registry.npmjs.org/@alicanyucelankara06/generic-service/-/generic-service-1.0.0.tgz","fileCount":13,"unpackedSize":68268,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIBdf29w0F5uo5lsVvezqEjrPN0c9TujTlx07n+khepvtAiBtH4pdAVQa8H9hd+VtRFDpHMXh0PykXeoWjhX3p4FTug=="}]},"_npmUser":{"name":"alicanyucelankara06","email":"yucelalican30@gmail.com"},"directories":{},"maintainers":[{"name":"alicanyucelankara06","email":"yucelalican30@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/generic-service_1.0.0_1775918827191_0.27828293780178526"},"_hasShrinkwrap":false}},"time":{"created":"2026-04-11T14:47:07.113Z","1.0.0":"2026-04-11T14:47:07.351Z","modified":"2026-04-11T14:47:07.529Z"},"maintainers":[{"name":"alicanyucelankara06","email":"yucelalican30@gmail.com"}],"description":"Angular 21 Generic CRUD Service Package","license":"MIT","readme":"# @acy/generic-service\r\n\r\nAngular 21 için Generic CRUD Service paketi. Tüm entity servisleriniz için temel sınıf sağlar.\r\n\r\n## Özellikler\r\n\r\n- **CRUD Operasyonları** — `getAll`, `getById`, `create`, `update`, `patch`, `delete`\r\n- **Pagination** — Sayfalı veri çekme, sayfa navigasyonu\r\n- **Arama & Filtreleme** — Esnek query parametreleri\r\n- **Toplu İşlemler** — `deleteMany`\r\n- **Angular Signals** — Reactive state yönetimi (`items`, `loading`, `error` vb.)\r\n- **Hata Yönetimi** — Standart API hata modeli\r\n- **Konfigürasyon** — `InjectionToken` ile merkezi ayarlar\r\n\r\n## Kurulum\r\n\r\n```bash\r\nnpm install @acy/generic-service\r\n```\r\n\r\n## Konfigürasyon\r\n\r\n`app.config.ts` içinde:\r\n\r\n```typescript\r\nimport { ApplicationConfig, provideHttpClient } from '@angular/core';\r\nimport { provideGenericServiceConfig } from '@acy/generic-service';\r\n\r\nexport const appConfig: ApplicationConfig = {\r\n  providers: [\r\n    provideHttpClient(),\r\n    provideGenericServiceConfig({\r\n      baseUrl: 'https://api.example.com',\r\n      defaultPageSize: 20,\r\n      enableLogging: true,\r\n    }),\r\n  ],\r\n};\r\n```\r\n\r\n## Kullanım\r\n\r\n### 1. Entity Model Tanımla\r\n\r\n```typescript\r\nimport { BaseEntity } from '@acy/generic-service';\r\n\r\nexport interface User extends BaseEntity {\r\n  id: number;\r\n  name: string;\r\n  email: string;\r\n  role: 'admin' | 'user';\r\n}\r\n```\r\n\r\n### 2. Service Oluştur\r\n\r\n```typescript\r\nimport { Injectable } from '@angular/core';\r\nimport { GenericService } from '@acy/generic-service';\r\nimport { User } from './user.model';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class UserService extends GenericService<User> {\r\n  constructor() {\r\n    super('users'); // API endpoint: https://api.example.com/users\r\n  }\r\n}\r\n```\r\n\r\n### 3. Component İçinde Kullan\r\n\r\n```typescript\r\nimport { Component, inject, OnInit } from '@angular/core';\r\nimport { UserService } from './user.service';\r\n\r\n@Component({\r\n  selector: 'app-user-list',\r\n  template: `\r\n    @if (userService.loading()) {\r\n      <p>Yükleniyor...</p>\r\n    }\r\n\r\n    @if (userService.error(); as error) {\r\n      <p class=\"error\">{{ error.message }}</p>\r\n    }\r\n\r\n    @for (user of userService.items(); track user.id) {\r\n      <div (click)=\"userService.select(user)\">\r\n        {{ user.name }} - {{ user.email }}\r\n      </div>\r\n    }\r\n\r\n    <div class=\"pagination\">\r\n      <button (click)=\"userService.previousPage()\">Önceki</button>\r\n      <span>{{ userService.currentPage() }} / {{ userService.totalPages() }}</span>\r\n      <button (click)=\"userService.nextPage()\">Sonraki</button>\r\n    </div>\r\n  `,\r\n})\r\nexport class UserListComponent implements OnInit {\r\n  protected readonly userService = inject(UserService);\r\n\r\n  ngOnInit() {\r\n    this.userService.getPaged().subscribe();\r\n  }\r\n}\r\n```\r\n\r\n### 4. CRUD İşlemleri\r\n\r\n```typescript\r\n// Tümünü getir\r\nthis.userService.getAll().subscribe();\r\n\r\n// Sayfalı getir\r\nthis.userService.getPaged({ page: 1, pageSize: 10, sort: 'name' }).subscribe();\r\n\r\n// ID ile getir\r\nthis.userService.getById(1).subscribe();\r\n\r\n// Yeni oluştur\r\nthis.userService.create({ name: 'Ali', email: 'ali@test.com', role: 'user' }).subscribe();\r\n\r\n// Güncelle\r\nthis.userService.update(1, { name: 'Ali Can' }).subscribe();\r\n\r\n// PATCH\r\nthis.userService.patch(1, { role: 'admin' }).subscribe();\r\n\r\n// Sil\r\nthis.userService.delete(1).subscribe();\r\n\r\n// Toplu sil\r\nthis.userService.deleteMany([1, 2, 3]).subscribe();\r\n\r\n// Ara\r\nthis.userService.search('ali').subscribe();\r\n```\r\n\r\n### 5. Override Örnekleri\r\n\r\n```typescript\r\n@Injectable({ providedIn: 'root' })\r\nexport class ProductService extends GenericService<Product> {\r\n  constructor() {\r\n    super('products');\r\n  }\r\n\r\n  // Özel endpoint\r\n  getByCategory(categoryId: number) {\r\n    return this.http.get<Product[]>(`${this.apiUrl}/category/${categoryId}`);\r\n  }\r\n\r\n  // buildHttpParams override\r\n  protected override buildHttpParams(params?: QueryParams): HttpParams {\r\n    let httpParams = super.buildHttpParams(params);\r\n    httpParams = httpParams.set('include', 'category,tags');\r\n    return httpParams;\r\n  }\r\n}\r\n```\r\n\r\n## API Referansı\r\n\r\n### GenericService<T>\r\n\r\n| Method | Dönüş Tipi | Açıklama |\r\n|---|---|---|\r\n| `getAll(params?)` | `Observable<T[]>` | Tüm kayıtları getirir |\r\n| `getPaged(params?)` | `Observable<PagedResponse<T>>` | Sayfalı getirir |\r\n| `getById(id)` | `Observable<T>` | Tek kayıt |\r\n| `create(item)` | `Observable<T>` | Yeni kayıt |\r\n| `update(id, item)` | `Observable<T>` | Tam güncelleme |\r\n| `patch(id, item)` | `Observable<T>` | Kısmi güncelleme |\r\n| `delete(id)` | `Observable<void>` | Silme |\r\n| `deleteMany(ids)` | `Observable<void>` | Toplu silme |\r\n| `search(term, params?)` | `Observable<T[]>` | Arama |\r\n\r\n### Signals (Readonly)\r\n\r\n| Signal | Tip | Açıklama |\r\n|---|---|---|\r\n| `items` | `Signal<T[]>` | Mevcut liste |\r\n| `selectedItem` | `Signal<T \\| null>` | Seçili kayıt |\r\n| `loading` | `Signal<boolean>` | Yükleniyor mu |\r\n| `error` | `Signal<ApiError \\| null>` | Son hata |\r\n| `totalCount` | `Signal<number>` | Toplam kayıt |\r\n| `currentPage` | `Signal<number>` | Mevcut sayfa |\r\n| `pageSize` | `Signal<number>` | Sayfa boyutu |\r\n| `totalPages` | `Signal<number>` | Toplam sayfa (computed) |\r\n| `hasData` | `Signal<boolean>` | Veri var mı (computed) |\r\n\r\n## Build\r\n\r\n```bash\r\nnpm run build\r\n```\r\n\r\n## Lisans\r\n\r\nMIT\r\n","readmeFilename":"README.md","_rev":"1-2f015131c37f0f8214366fdc11e07f4a"}