Skip to content

Commit

Permalink
More clean up (#110)
Browse files Browse the repository at this point in the history
  • Loading branch information
jogboms committed Jun 30, 2023
2 parents d061e32 + c7f1c5c commit 50d3cde
Show file tree
Hide file tree
Showing 186 changed files with 2,814 additions and 2,113 deletions.
18 changes: 0 additions & 18 deletions ios/Flutter/Flutter.podspec

This file was deleted.

6 changes: 3 additions & 3 deletions lib/core/group_by.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
Map<String, List<T>> groupBy<T extends Object>(List<T> list, String Function(T) fn) {
return list.fold(<String, List<T>>{}, (Map<String, List<T>> rv, T x) {
final String key = fn(x);
Map<K, List<T>> groupBy<K, T extends Object>(List<T> list, K Function(T) fn) {
return list.fold(<K, List<T>>{}, (Map<K, List<T>> rv, T x) {
final K key = fn(x);
(rv[key] = rv[key] ?? <T>[]).add(x);
return rv;
});
Expand Down
2 changes: 2 additions & 0 deletions lib/data.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ export 'data/repositories/contacts/contacts_impl.dart';
export 'data/repositories/contacts/contacts_mock_impl.dart';
export 'data/repositories/gallery/gallery_impl.dart';
export 'data/repositories/gallery/gallery_mock_impl.dart';
export 'data/repositories/image_storage/image_storage_impl.dart';
export 'data/repositories/image_storage/image_storage_mock_impl.dart';
export 'data/repositories/jobs/jobs_impl.dart';
export 'data/repositories/jobs/jobs_mock_impl.dart';
export 'data/repositories/measures/measures_impl.dart';
Expand Down
9 changes: 4 additions & 5 deletions lib/data/network/firebase/auth.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,16 @@ import 'package:flutter/services.dart';
import 'package:google_sign_in/google_sign_in.dart';

import 'exception.dart';
import 'models.dart';

class Auth {
Auth(this._auth, this._googleSignIn);

final FirebaseAuth _auth;
final GoogleSignIn _googleSignIn;

FireUser? get getUser => _mapFirebaseUserToUser(_auth.currentUser);
String? get getUser => _mapFirebaseUserToUser(_auth.currentUser);

Stream<FireUser?> get onAuthStateChanged => _auth.authStateChanges().map(_mapFirebaseUserToUser);
Stream<String?> get onAuthStateChanged => _auth.authStateChanges().map(_mapFirebaseUserToUser);

Future<String> signInWithGoogle() async {
try {
Expand Down Expand Up @@ -90,10 +89,10 @@ class Auth {
await _googleSignIn.signOut();
}

FireUser? _mapFirebaseUserToUser(User? user) {
String? _mapFirebaseUserToUser(User? user) {
if (user == null) {
return null;
}
return FireUser(user);
return user.uid;
}
}
30 changes: 13 additions & 17 deletions lib/data/network/firebase/cloud_db.dart
Original file line number Diff line number Diff line change
Expand Up @@ -7,23 +7,7 @@ class CloudDb {

final FirebaseFirestore _instance;

MapDocumentReference account(String? userId) => _instance.doc('accounts/$userId');

MapDocumentReference stats(String? userId) => _instance.doc('stats/$userId');

MapDocumentReference get settings => _instance.doc('settings/common');

MapCollectionReference measurements(String? userId) => _instance.collection('measurements/$userId/common');

MapCollectionReference get premium => _instance.collection('premium');

MapQuery gallery(String userId) => _instance.collection('gallery').where('userID', isEqualTo: userId);

MapQuery payments(String userId) => _instance.collection('payments').where('userID', isEqualTo: userId);

MapQuery contacts(String? userId) => _instance.collection('contacts').where('userID', isEqualTo: userId);

MapQuery jobs(String? userId) => _instance.collection('jobs').where('userID', isEqualTo: userId);
MapCollectionReference collection(String path) => _instance.collection(path);

MapDocumentReference doc(String path) => _instance.doc(path);

Expand All @@ -35,3 +19,15 @@ class CloudDb {
return batch.commit();
}
}

class CloudDbCollection {
const CloudDbCollection(this.db, this.path);

final CloudDb db;

final String path;

MapCollectionReference fetchAll() => db.collection(path);

MapDocumentReference fetchOne(String uuid) => db.doc('$path/$uuid');
}
14 changes: 10 additions & 4 deletions lib/data/network/firebase/cloud_storage.dart
Original file line number Diff line number Diff line change
@@ -1,14 +1,20 @@
import 'package:firebase_storage/firebase_storage.dart';
import 'package:universal_io/io.dart';
import 'package:uuid/uuid.dart';

class CloudStorage {
CloudStorage(this._instance);

final FirebaseStorage _instance;

Reference createContactImage(String userId) =>
_instance.ref().child('$userId/contacts').child('${const Uuid().v1()}.jpg');
Future<({String src, String path})> create(String directory, {required String filePath}) {
final Reference ref = _instance.ref().child('$directory/${const Uuid().v4()}.jpg');

Reference createReferenceImage(String userId) =>
_instance.ref().child('$userId/references').child('${const Uuid().v1()}.jpg');
return ref
.putFile(File(filePath))
.then((_) => ref.getDownloadURL())
.then((String src) => (src: src, path: ref.fullPath));
}

Future<void> delete({required String src}) => _instance.refFromURL(src).delete();
}
46 changes: 0 additions & 46 deletions lib/data/network/firebase/models.dart
Original file line number Diff line number Diff line change
@@ -1,50 +1,4 @@
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_auth/firebase_auth.dart' as auth;
import 'package:firebase_storage/firebase_storage.dart' as storage;
import 'package:tailor_made/domain.dart';

class FireUser implements User {
FireUser(this._reference);

final auth.User? _reference;

@override
String? get uid => _reference?.uid;
}

class FireStorage implements Storage {
FireStorage(this._reference);

final storage.Reference _reference;

@override
Future<void> delete() => _reference.delete();

@override
Future<String> getDownloadURL() => _reference.getDownloadURL();

@override
String get path => _reference.fullPath;
}

class FireReference implements Reference {
FireReference(this._reference);

final MapDocumentReference _reference;

@override
MapDocumentReference get source => _reference;

@override
Future<void> delete() => _reference.delete();

@override
Future<void> setData(Map<String, dynamic> data, {bool merge = false}) =>
_reference.set(data, SetOptions(merge: true));

@override
Future<void> updateData(Map<String, dynamic> data) => _reference.update(data);
}

typedef DynamicMap = Map<String, dynamic>;
typedef MapQuery = Query<DynamicMap>;
Expand Down
73 changes: 55 additions & 18 deletions lib/data/repositories/accounts/accounts_impl.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,51 +6,88 @@ class AccountsImpl extends Accounts {
AccountsImpl({
required this.firebase,
required this.isDev,
});
}) : collection = CloudDbCollection(firebase.db, collectionName);

final Firebase firebase;
final bool isDev;
final CloudDbCollection collection;

static const String collectionName = 'accounts';

@override
Future<void> signInWithGoogle() => firebase.auth.signInWithGoogle();

@override
Stream<FireUser?> get onAuthStateChanged => firebase.auth.onAuthStateChanged;
Stream<String?> get onAuthStateChanged => firebase.auth.onAuthStateChanged;

@override
Future<void> signOut() => firebase.auth.signOutWithGoogle();

@override
Future<void> readNotice(AccountModel account) async => account.reference?.updateData(account.toJson());
Future<String> signUp(AccountEntity account) async {
final Map<String, Object?> data = <String, Object?>{
'uid': account.uid,
'storeName': account.storeName,
'email': account.email,
'displayName': account.displayName,
'phoneNumber': account.phoneNumber,
'photoURL': account.photoURL,
'status': account.status.index,
'hasPremiumEnabled': account.hasPremiumEnabled,
'hasSendRating': account.hasSendRating,
'rating': account.rating,
'notice': account.notice,
'hasReadNotice': account.hasReadNotice,
};
await collection.fetchOne(account.uid).set(data);
await firebase.db.collection('premium').doc(account.uid).set(data);
return account.uid;
}

@override
Future<void> sendRating(AccountModel account) async => account.reference?.updateData(account.toJson());
Future<AccountEntity?> getAccount(String userId) async {
final MapDocumentSnapshot doc = await collection.fetchOne(userId).get();
if (!doc.exists) {
return null;
}

@override
Future<void> signUp(AccountModel account) async {
await account.reference?.updateData(account.toJson());
await firebase.db.premium.doc(account.uid).set(account.toJson());
return _deriveAccountEntity(doc.id, doc.reference.path, doc.data()!);
}

@override
Stream<AccountModel> getAccount(String? userId) => firebase.db.account(userId).snapshots().map(_deriveAccountModel);
Future<bool> updateAccount(
String userId, {
required String id,
required String path,
String? storeName,
bool? hasSendRating,
int? rating,
bool? hasReadNotice,
}) async {
await collection.fetchOne(userId).update(<String, Object?>{
if (storeName != null) 'storeName': storeName,
if (hasSendRating != null) 'hasSendRating': hasSendRating,
if (rating != null) 'rating': rating,
if (hasReadNotice != null) 'hasReadNotice': hasReadNotice,
});
return true;
}
}

AccountModel _deriveAccountModel(MapDocumentSnapshot snapshot) {
final DynamicMap data = snapshot.data()!;
return AccountModel(
reference: FireReference(snapshot.reference),
AccountEntity _deriveAccountEntity(String id, String path, DynamicMap data) {
return AccountEntity(
reference: ReferenceEntity(id: id, path: path),
uid: data['uid'] as String,
storeName: data['storeName'] as String,
email: data['email'] as String,
displayName: data['displayName'] as String,
phoneNumber: data['phoneNumber'] as int?,
photoURL: data['photoURL'] as String,
status: AccountModelStatus.values[data['status'] as int],
photoURL: data['photoURL'] as String?,
status: AccountStatus.values[data['status'] as int],
hasPremiumEnabled: data['hasPremiumEnabled'] as bool,
hasSendRating: data['hasSendRating'] as bool,
rating: data['rating'] as int,
hasSendRating: data['hasSendRating'] == true,
rating: data['rating'] as int? ?? 0,
notice: data['notice'] as String,
hasReadNotice: data['hasReadNotice'] as bool,
hasReadNotice: data['hasReadNotice'] == true,
);
}
43 changes: 20 additions & 23 deletions lib/data/repositories/accounts/accounts_mock_impl.dart
Original file line number Diff line number Diff line change
@@ -1,21 +1,14 @@
import 'package:tailor_made/domain.dart';

class MockUser implements User {
const MockUser([this.uid = '1']);

@override
final String uid;
}

class AccountsMockImpl extends Accounts {
@override
Future<void> signInWithGoogle() async {
return;
}

@override
Stream<User?> get onAuthStateChanged async* {
yield const MockUser();
Stream<String?> get onAuthStateChanged async* {
yield '1';
}

@override
Expand All @@ -24,29 +17,20 @@ class AccountsMockImpl extends Accounts {
}

@override
Future<void> readNotice(AccountModel account) async {
return;
}

@override
Future<void> sendRating(AccountModel account) async {
Future<void> signUp(AccountEntity account) async {
return;
}

@override
Future<void> signUp(AccountModel account) async {
return;
}

@override
Stream<AccountModel> getAccount(String? userId) async* {
yield const AccountModel(
Future<AccountEntity?> getAccount(String userId) async {
return const AccountEntity(
reference: ReferenceEntity(id: 'id', path: 'path'),
uid: '1',
notice: 'Hello',
phoneNumber: 123456789,
email: '[email protected]',
displayName: 'Jogboms',
status: AccountModelStatus.enabled,
status: AccountStatus.enabled,
rating: 5,
hasPremiumEnabled: true,
hasReadNotice: false,
Expand All @@ -55,4 +39,17 @@ class AccountsMockImpl extends Accounts {
storeName: 'Jogboms',
);
}

@override
Future<bool> updateAccount(
String userId, {
required String id,
required String path,
String? storeName,
bool? hasSendRating,
int? rating,
bool? hasReadNotice,
}) async {
return true;
}
}
Loading

0 comments on commit 50d3cde

Please sign in to comment.