Initial commit: DLS - Dental Lab System

- Flutter + PocketBase dental lab management system
- Clinic & lab dashboards, job tracking, patient management
- Product catalog, finance tracking, multi-language support
- AI assistant integration, realtime notifications
- Windows installer (Inno Setup) included
- Developed by kovakyazilim.com
This commit is contained in:
Emre Emir
2026-06-11 15:57:31 +03:00
commit 8bbc9dbff2
226 changed files with 31308 additions and 0 deletions
@@ -0,0 +1,59 @@
import 'package:http/http.dart' as http;
import 'package:pocketbase/pocketbase.dart';
import '../../core/api/pocketbase_client.dart';
import '../../models/job_file.dart';
class JobFilesRepository {
JobFilesRepository._();
static final instance = JobFilesRepository._();
PocketBase get _pb => PocketBaseClient.instance.pb;
static const _baseUrl = 'https://pocket.kovaksoft.com';
String get _currentUserId => (_pb.authStore.record?.id) ?? '';
Future<List<JobFile>> listForJob(String jobId) async {
final result = await _pb.collection('job_files').getList(
filter: 'job_id = "$jobId"',
perPage: 200,
);
final files = result.items.map((r) => JobFile.fromJson(r.toJson(), _baseUrl)).toList()
..sort((a, b) => b.createdAt.compareTo(a.createdAt));
return files;
}
Future<JobFile> uploadFile({
required String jobId,
required String clinicTenantId,
required String labTenantId,
required JobFileKind kind,
required String name,
required int size,
required List<int> bytes,
String? mimeType,
}) async {
final multipartFile = http.MultipartFile.fromBytes(
'file',
bytes,
filename: name,
);
final record = await _pb.collection('job_files').create(
body: {
'job_id': jobId,
'clinic_tenant_id': clinicTenantId,
'lab_tenant_id': labTenantId,
'uploaded_by': _currentUserId,
'kind': kind.value,
'name': name,
'size': size,
if (mimeType != null) 'mime_type': mimeType,
},
files: [multipartFile],
);
return JobFile.fromJson(record.toJson(), _baseUrl);
}
Future<void> deleteFile(String fileId) async {
await _pb.collection('job_files').delete(fileId);
}
}