/* * @Author : Linloir * @Date : 2022-10-11 09:44:03 * @LastEditTime : 2022-10-11 16:01:54 * @Description : Abstract TCP request class */ export 'package:tcp_client/repositories/tcp_repository/models/tcp_request.dart'; import 'dart:convert'; import 'package:tcp_client/repositories/common_models/message.dart'; import 'package:tcp_client/repositories/common_models/useridentity.dart'; import 'package:tcp_client/repositories/common_models/userinfo.dart'; import 'package:tcp_client/repositories/file_repository/models/local_file.dart'; enum TCPRequestType { checkState ('STATE'), //Check login state for device token register ('REGISTER'), //Register new user login ('LOGIN'), //Login via username and password logout ('LOGOUT'), //Logout for current device token profile ('PROFILE'), //Fetch current logged in user profile modifyPassword('MODIFYPASSWD'), //Modify user password modifyProfile ('MODIFYPROFILE'), //Modify user profile sendMessage ('SENDMSG'), //Send message fetchMessage ('FETCHMSG'), //Fetch message findFile ('FINDFILE'), //Find file by md5 before transmitting the file fetchFile ('FETCHFILE'), //Fetch file and file md5 by message md5 searchUser ('SEARCHUSR'), //Search username and userid by username addContact ('ADDCONTACT'), //Add one-way relation to a user fetchContact ('FETCHCONTACT'), //Fetch all contacts, including requesting and pending unknown ('UNKNOWN'); //Wrong command const TCPRequestType(String value): _value = value; final String _value; String get value => _value; //Construct the enum type by value factory TCPRequestType.fromValue(String value) { return TCPRequestType.values.firstWhere((element) => element._value == value, orElse: () => TCPRequestType.unknown); } } abstract class TCPRequest { final TCPRequestType _type; final int _token; const TCPRequest({required TCPRequestType type, required int token}): _type = type, _token = token; TCPRequestType get type => _type; int get token => _token; Map get body; String toJSON() { return jsonEncode({ 'request': type.value, 'body': body, 'token': token }); } } class CheckStateRequest extends TCPRequest { const CheckStateRequest({required int token}): super(type: TCPRequestType.checkState, token: token); @override Map get body => {}; } class RegisterRequest extends TCPRequest { final UserIdentity _identity; RegisterRequest({ required UserIdentity identity, required token }): _identity = identity, super(type: TCPRequestType.register, token: token); @override Map get body => _identity.jsonObject; } class LoginRequest extends TCPRequest { final UserIdentity _identity; LoginRequest({ required UserIdentity identity, required token }): _identity = identity, super(type: TCPRequestType.login, token: token); @override Map get body => _identity.jsonObject; } class LogoutRequest extends TCPRequest { const LogoutRequest({required int token}): super(type: TCPRequestType.logout, token: token); @override Map get body => {}; } class GetProfileRequest extends TCPRequest { const GetProfileRequest({required int token}): super(type: TCPRequestType.profile, token: token); @override Map get body => {}; } class ModifyPasswordRequest extends TCPRequest { final UserIdentity _identity; ModifyPasswordRequest({ required UserIdentity identity, required token }): _identity = identity, super(type: TCPRequestType.modifyPassword, token: token); @override Map get body => _identity.jsonObject; } class ModifyProfileRequest extends TCPRequest { final UserInfo _userinfo; const ModifyProfileRequest ({ required UserInfo userInfo, required int token }): _userinfo = userInfo, super(type: TCPRequestType.modifyProfile, token: token); @override Map get body => _userinfo.jsonObject; } class SendMessageRequest extends TCPRequest { final Message _message; SendMessageRequest({ required Message message, required int token }): _message = message, super(type: TCPRequestType.sendMessage, token: token); @override Map get body => _message.jsonObject; Message get message => _message; } class FetchMessageRequest extends TCPRequest { const FetchMessageRequest({required int token}): super(type: TCPRequestType.fetchMessage, token: token); @override Map get body => {}; } class FindFileRequest extends TCPRequest { final LocalFile _file; const FindFileRequest({required LocalFile file, required int token}): _file = file, super(type: TCPRequestType.findFile, token: token); @override Map get body => { 'filemd5': _file.filemd5 }; LocalFile get file => _file; } class FetchFileRequest extends TCPRequest { final String _msgmd5; const FetchFileRequest({required String msgmd5, required int token}): _msgmd5 = msgmd5, super(type: TCPRequestType.fetchFile, token: token); @override Map get body => { 'msgmd5': _msgmd5, }; String get msgmd5 => _msgmd5; } class SearchUserRequest extends TCPRequest { final String _username; const SearchUserRequest({required String username, required int token}): _username = username, super(type: TCPRequestType.searchUser, token: token); @override Map get body => { 'username': _username, }; String get username => _username; } class AddContactRequest extends TCPRequest { final int _userid; const AddContactRequest({required int userid, required int token}): _userid = userid, super(type: TCPRequestType.addContact, token: token); @override Map get body => { 'userid': _userid, }; int get userid => _userid; } class FetchContactRequest extends TCPRequest { const FetchContactRequest({required int token}): super(type: TCPRequestType.fetchContact, token: token); @override Map get body => {}; }