Skip to content

Commit

Permalink
add use case refactor model and abstract query parameter
Browse files Browse the repository at this point in the history
  • Loading branch information
ManhNTX committed Jan 30, 2023
1 parent 9f8f496 commit 47a445e
Show file tree
Hide file tree
Showing 17 changed files with 282 additions and 146 deletions.
22 changes: 22 additions & 0 deletions lib/core/network/model/query/query_parameter.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
abstract class QueryParameter<T> {
final String queryName;
final T queryValue;

QueryParameter(this.queryName, this.queryValue);
}

class BooleanQueryParameter extends QueryParameter<bool> {
BooleanQueryParameter(String queryName, bool queryValue) : super(queryName, queryValue);
}

class StringQueryParameter extends QueryParameter<String> {
StringQueryParameter(String queryName, String queryValue) : super(queryName, queryValue);
}

class IntQueryParameter extends QueryParameter<int> {
IntQueryParameter(String queryName, int queryValue) : super(queryName, queryValue);
}

extension ListQueryParameterExtension on List<QueryParameter?> {
Map<String, dynamic> toMap() => { for (var data in this) if (data != null) data.queryName : data.queryValue };
}
15 changes: 15 additions & 0 deletions lib/core/state/app_state.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import 'package:dartz/dartz.dart';
import 'package:meta/meta.dart';
import 'package:equatable/equatable.dart';
import 'package:twake/core/state/failure.dart';
import 'package:twake/core/state/success.dart';

@immutable
abstract class AppState with EquatableMixin {
final Either<Failure, Success> viewState;

AppState(this.viewState);

@override
List<Object?> get props => [viewState];
}
16 changes: 16 additions & 0 deletions lib/core/state/failure.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import 'package:equatable/equatable.dart';

abstract class Failure extends Equatable {}

abstract class FeatureFailure extends Failure {}

class ExceptionFailure extends Failure {
final dynamic exception;

ExceptionFailure(this.exception);

@override
List<Object?> get props => [
exception,
];
}
48 changes: 48 additions & 0 deletions lib/core/state/success.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
import 'package:equatable/equatable.dart';

abstract class Success with EquatableMixin {}

abstract class ViewState extends Success {}

abstract class ViewEvent extends Success {}

class UIState extends ViewState {
static final idle = UIState();

UIState() : super();

@override
List<Object?> get props => [];
}

class SuccessUIState<T> extends ViewState {
final T result;

SuccessUIState(this.result) : super();

@override
List<Object?> get props => [
result,
];
}

class LoadingState extends UIState {
LoadingState();

@override
List<Object?> get props => [];
}

class LoadingMoreState extends UIState {
LoadingMoreState();

@override
List<Object?> get props => [];
}

class RefreshingState extends UIState {
RefreshingState();

@override
List<Object?> get props => [];
}
3 changes: 1 addition & 2 deletions lib/features/message/data/datasource/message_datasource.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import 'package:twake/features/message/data/model/message/response/message.dart';
import 'package:twake/models/base_model/base_model.dart';

abstract class MessageDataSource {
Future<List<Message>> fetch({
Expand All @@ -12,6 +11,6 @@ abstract class MessageDataSource {
});

Future<void> multiInsert({
required Iterable<BaseModel> data,
required Iterable<Message> data,
});
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import 'package:twake/features/message/data/datasource/message_datasource.dart';
import 'package:twake/features/message/data/model/message/response/message.dart';
import 'package:twake/models/base_model/base_model.dart';
import 'package:twake/services/storage_service.dart';

class LocalMessageDataSourceImpl extends MessageDataSource {
Expand Down Expand Up @@ -42,7 +41,7 @@ class LocalMessageDataSourceImpl extends MessageDataSource {
}

@override
Future<void> multiInsert({required Iterable<BaseModel> data}) async {
Future<void> multiInsert({required Iterable<Message> data}) async {
await _storage.multiInsert(table: Table.message, data: data);
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import 'package:sprintf/sprintf.dart';
import 'package:twake/core/network/model/query/query_parameter.dart';
import 'package:twake/features/message/data/datasource/message_datasource.dart';
import 'package:twake/features/message/data/model/message/response/message.dart';
import 'package:twake/models/base_model/base_model.dart';
Expand All @@ -18,19 +19,24 @@ class RemoteMessageDataSourceImpl extends MessageDataSource {
String? afterMessageId,
bool? withExistedFiles = false}) async {
List<dynamic> remoteResult;
final queryParameters = <String, dynamic>{
'include_users': 1,
'emoji': false,
'direction': 'history',
'limit': 25,
};

final queryParameters = <QueryParameter?>[
IntQueryParameter('include_users', 1),
BooleanQueryParameter('emoji', false),
StringQueryParameter('direction', 'history'),
IntQueryParameter('limit', 25),
];

if (afterMessageId != null) {
queryParameters['page_token'] = afterMessageId;
queryParameters['direction'] = 'future';
queryParameters.addAll([
StringQueryParameter('page_token', afterMessageId),
StringQueryParameter('direction', 'future'),
]);
}
if (withExistedFiles == true) {
queryParameters['filter'] = 'files';
queryParameters.add(
StringQueryParameter('filter', 'files'),
);
}
if (threadId == null) {
remoteResult = await _api.get(
Expand All @@ -39,22 +45,22 @@ class RemoteMessageDataSourceImpl extends MessageDataSource {
workspaceId ?? Globals.instance.workspaceId,
channelId
]),
queryParameters: queryParameters,
queryParameters: queryParameters.toMap(),
key: 'resources',
);
} else {
final queryParameters = <String, dynamic>{
'include_users': 1,
'emoji': false,
'direction': 'history',
};
final queryParameters = <QueryParameter?>[
IntQueryParameter('include_users', 1),
BooleanQueryParameter('emoji', false),
StringQueryParameter('direction', 'history'),
];

remoteResult = await _api.get(
endpoint: sprintf(Endpoint.threadMessages, [
companyId ?? Globals.instance.companyId,
threadId,
]),
queryParameters: queryParameters,
queryParameters: queryParameters.toMap(),
key: 'resources',
);
}
Expand Down
47 changes: 22 additions & 25 deletions lib/features/message/data/model/message/response/message.dart
Original file line number Diff line number Diff line change
Expand Up @@ -29,54 +29,53 @@ class Message extends BaseModel {
final String channelId;
final String userId;

int createdAt;
int updatedAt;
final int createdAt;
final int updatedAt;

@JsonKey(defaultValue: 0)
int responsesCount;
final int responsesCount;

@JsonKey(defaultValue: '')
String text;
final String text;

List<dynamic> blocks;
final List<dynamic> blocks;

List<dynamic>? files;
final List<dynamic>? files;

MessageSubtype? subtype;
final MessageSubtype? subtype;

@JsonKey(defaultValue: const [])
List<Reaction> reactions;
final List<Reaction> reactions;

@JsonKey(name: 'pinned_info')
PinnedInfo? pinnedInfo;
final PinnedInfo? pinnedInfo;

String? username;
String? firstName;
String? lastName;
String? picture;
String? draft;
final String? username;
final String? firstName;
final String? lastName;
final String? picture;
final String? draft;

@JsonKey(defaultValue: 1, name: 'is_read')
int _isRead = 1;

@JsonKey(defaultValue: Delivery.delivered)
Delivery delivery;
final Delivery delivery;

@JsonKey(defaultValue: const [], name: 'last_replies')
List<Message>? lastReplies1;

@JsonKey(name: 'quote_message')
Message? quoteMessage;

List<Message>? get lastReplies => lastReplies1;
final Message? quoteMessage;

Message? get lastReply => lastReplies1 != null && lastReplies1!.isNotEmpty
? lastReplies1![lastReplies1!.length - 1]
: null;

List<Message>? get last3Replies {
if (lastReplies != null && lastReplies!.isNotEmpty) {
return lastReplies!
.getRange(responsesCount < 3 ? 1 : 0, lastReplies!.length)
if (lastReplies1 != null && lastReplies1!.isNotEmpty) {
return lastReplies1!
.getRange(responsesCount < 3 ? 1 : 0, lastReplies1!.length)
.toList();
}
return null;
Expand Down Expand Up @@ -176,6 +175,8 @@ class Message extends BaseModel {
this.picture,
this.draft,
this.quoteMessage,
this.subtype,
this.pinnedInfo,
List<Message>? lastReplies = const <Message>[],
List<MessageLink>? links = const <MessageLink>[],
}) {
Expand Down Expand Up @@ -229,21 +230,17 @@ class Message extends BaseModel {
enum Delivery {
@JsonValue('in_progress')
inProgress,

@JsonValue('delivered')
delivered,

@JsonValue('failed')
failed,
}

enum MessageSubtype {
@JsonValue('application')
application,

@JsonValue('deleted')
deleted,

@JsonValue('system')
system
}
19 changes: 9 additions & 10 deletions lib/features/message/data/model/message/response/message.g.dart

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ class Reaction {

final List<String> users;

int count;
final int count;

Reaction({
required this.name,
Expand Down
29 changes: 29 additions & 0 deletions lib/features/message/domain/usecases/fetch_message_usecase.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
import 'package:dartz/dartz.dart';
import 'package:twake/core/state/failure.dart';
import 'package:twake/features/message/data/model/message/response/message.dart';
import 'package:twake/features/message/domain/repository/message_repository.dart';

class FetchMessageUseCase {
final MessageRepository _messageRepository;

FetchMessageUseCase(
this._messageRepository,
);

Either<ExceptionFailure, Stream<List<Message>>> execute({ String? companyId,
String? workspaceId,
required String channelId,
String? threadId,
bool? withExistedFiles = false,}) {
try {
final stream = _messageRepository.fetch(
channelId: channelId,
threadId: threadId,
workspaceId: workspaceId,
);
return Right<ExceptionFailure, Stream<List<Message>>>(stream);
} catch (e) {
return Left<ExceptionFailure, Stream<List<Message>>>(ExceptionFailure(e));
}
}
}
Loading

0 comments on commit 47a445e

Please sign in to comment.