uaestats_fe/lib/infrastructure/services/pocketbase_service.dart
2026-05-25 18:01:41 +05:30

97 lines
2.4 KiB
Dart
Executable File

import 'dart:convert';
import 'package:pocketbase/pocketbase.dart';
import 'package:uae_stat/config/api_config.dart';
abstract class PocketBaseService {
static const _host = apiUrl;
static final _pb = PocketBase(_host);
static PocketBase get client => _pb;
static final users = _pb.collection('users');
}
/// must assign [T] as entity, which must have
/// [jsonEncode] and [jsonDecode] methods. In
/// pocketbase, records must be stored in one
/// column: data as type json. [V] is entity id
/// type
class PbCollection<T> {
PbCollection(
this.collectionIdOrName, {
required this.fromJson,
this.isNestedInJsonData = true,
});
final String collectionIdOrName;
final T Function(dynamic json) fromJson;
final bool isNestedInJsonData;
Map<T, String>? _entityIdToModelId;
RecordService get _collection => PocketBaseService._pb.collection(
collectionIdOrName,
);
Future<List<T>> getAll([
Map<String, dynamic>? filter,
]) async {
final modelList = await _collection.getFullList(
filter: filter?.entries
.map(
(e) => isNestedInJsonData
? 'data.${e.key}=${e.value}'
: '${e.key} = "${e.value}"',
)
.join(' '),
);
final entityList = modelList.map(
(model) {
final source = isNestedInJsonData ? model.data['data'] : model.data;
if (!isNestedInJsonData) source['id'] = model.id;
final entity = fromJson(source);
_entityIdToModelId ??= {};
_entityIdToModelId![entity] = model.id;
return entity;
},
).toList();
return entityList;
}
Future<T> get([
Map<String, dynamic> filter = const {},
]) {
final filterString = filter.isEmpty
? ''
: filter.entries
.map(
(e) => isNestedInJsonData
? 'data.${e.key}=${jsonEncode(e.value)}'
: '${e.key} = ${jsonEncode(e.value)}',
)
.join(' ');
return _collection
.getFirstListItem(
filterString,
)
.then(
(value) => fromJson(value.data['data']),
);
}
Future<void> delete(
T entity,
) =>
_collection.delete(
_entityIdToModelId![entity]!,
);
Future<void> write(T e) => _collection.create(
body: isNestedInJsonData
? {'data': e}
: jsonDecode(
jsonEncode(e),
),
);
}