budde377/Part

View on GitHub
dart/part/lib/src/site_class_mail_domain.dart

Summary

Maintainability
Test Coverage
part of site_classes;

abstract class MailDomain {

  String get domainName;

  MailAddressLibrary get addressLibrary;

  MailDomainLibrary get domainLibrary;

  String get description;

  FutureResponse<String> changeDescription(String description);

  String toString() => domainName;

  FutureResponse<MailDomain> delete(String password);

  FutureResponse<MailDomain> changeAliasTarget(MailDomain domain);

  FutureResponse<MailDomain> clearAliasTarget();

  bool get isDomainAlias;

  MailDomain get aliasTarget;


  DateTime get lastModified;

  bool get active;

  FutureResponse<bool> deactivate();

  FutureResponse<bool> activate();

  FutureResponse<bool> toggleActive();

  Stream<MailDomain> get onAliasTargetChange;

  Stream<String> get onDescriptionChange;

  Stream<MailDomain> get onDelete;

  Stream<bool> get onActiveChange;


}


class AJAXMailDomain extends MailDomain {

  final MailDomainLibrary domainLibrary;

  Function _addressLibraryGenerator;

  MailAddressLibrary _addressLibrary;

  final String domainName;

  final UserLibrary userLibrary;

  bool _active;

  DateTime _lastModified;

  String _description;

  MailDomain _aliasTarget;

  StreamController
  _onDeleteController,
  _onAliasTargetChangeController = new StreamController<bool>(),
  _onActiveChangeController = new StreamController<bool>(),
  _onDescriptionChangeController = new StreamController<String>();

  Stream
  _onDeleteStream,
  _onAliasTargetChangeStream,
  _onActiveChangeStream,
  _onDescriptionChangeStream;

  AJAXMailDomain(this.domainName, MailAddressLibrary addressLibraryGenerator(MailDomain), MailDomainLibrary domainLibrary, this.userLibrary, {String description:"", bool active:true, DateTime last_modified: null, String alias_target: null}) :
  _description = description,
  _addressLibraryGenerator = addressLibraryGenerator,
  _active = active,
  this.domainLibrary = domainLibrary,
  _lastModified = last_modified == null ? new DateTime.fromMillisecondsSinceEpoch(0) : last_modified {
    _aliasTarget = alias_target == domainName ? this : domainLibrary.domains[alias_target];
  }


  AJAXMailDomain.fromJSONObject(JSONObject object, this.domainLibrary, this.userLibrary):
  this.domainName = object.variables['domain_name'],
  this._active = object.variables['active'],
  this._description = object.variables['description'],
  this._lastModified = new DateTime.fromMillisecondsSinceEpoch(object.variables['last_modified'] * 1000){
    _addressLibraryGenerator = (MailDomain d) => new AJAXMailAddressLibrary.fromJSONObject(object.variables['address_library'], d, userLibrary);
    var alias_target = object.variables['alias_target'];
    if (alias_target != null) {
      this._aliasTarget = alias_target == domainName ? this : domainLibrary.domains[alias_target];

    }
  }

  String get _domainLibraryGetter => "MailDomainLibrary.getDomain(${quoteString(domainName)})";

  FutureResponse<MailDomain> delete(String password) => domainLibrary.deleteDomain(this, password);


  FutureResponse<MailDomain> changeAliasTarget(MailDomain domain) =>
  ajaxClient
  .callFunctionString(_domainLibraryGetter + "..setAliasTarget(MailDomainLibrary.getDomain(${quoteString(domain.domainName)}))..getInstance()")
  .thenResponse(onSuccess:(Response<JSONObject> response) {
    var newTarget = response.payload.variables['alias_target'];
    if (newTarget == null || newTarget != domain.domainName) {
      return new Response.error(Response.ERROR_CODE_UNKNOWN_ERROR);
    }
    _aliasTarget = domain;
    domain.onDelete.listen((_) {
      if (domain != _aliasTarget) {
        return;
      }
      _aliasTarget = null;
      _onAliasTargetChangeController.add(_aliasTarget);
    });
    _lastModified = new DateTime.fromMillisecondsSinceEpoch(response.payload.variables['last_modified'] * 1000);
    _onAliasTargetChangeController.add(_aliasTarget);
    return new Response.success(_aliasTarget);
  });

  FutureResponse<MailDomain> clearAliasTarget() {
    if (!isDomainAlias) {
      return new FutureResponse.success(null);
    }
    return ajaxClient.callFunctionString(_domainLibraryGetter + "..clearAliasTarget()..getInstance()")
    .thenResponse(onSuccess:(Response<JSONObject> response) {
      if (response.payload.variables['alias_target'] != null) {

        return new Response.error(Response.ERROR_CODE_UNKNOWN_ERROR);
      }
      _aliasTarget = null;
      _lastModified = new DateTime.fromMillisecondsSinceEpoch(response.payload.variables['last_modified'] * 1000);
      _onAliasTargetChangeController.add(_aliasTarget);
      return new Response.success(_aliasTarget);
    });
  }

  bool get isDomainAlias => _aliasTarget != null;

  MailDomain get aliasTarget => _aliasTarget;


  String get description => _description;

  bool get active => _active;

  MailAddressLibrary get addressLibrary => _addressLibrary == null ? _addressLibrary = _addressLibraryGenerator(this) : _addressLibrary;

  FutureResponse<String> changeDescription(String description) {
    var completer = new Completer<Response<String>>();

    ajaxClient.callFunctionString(_domainLibraryGetter + ".setDescription(${quoteString(description)}).getInstance()").then((Response<JSONObject> response) {
      if (response.type != Response.RESPONSE_TYPE_SUCCESS) {
        completer.complete(response);
        return;
      }

      _description = response.payload.variables['description'];
      _lastModified = new DateTime.fromMillisecondsSinceEpoch(response.payload.variables['last_modified'] * 1000);
      completer.complete(new Response.success(_description));
      _onDescriptionChangeController.add(_description);
    });


    return new FutureResponse(completer.future);
  }


  DateTime get lastModified => _lastModified;

  FutureResponse<bool> deactivate() {
    if (!active) {
      return new Future(() => active);
    }

    var completer = new Completer<Response<String>>();

    ajaxClient.callFunctionString(_domainLibraryGetter + ".deactivate().getInstance()").then((Response<JSONObject> response) {
      if (response.type != Response.RESPONSE_TYPE_SUCCESS) {
        completer.complete(response);
        return;
      }

      _active = response.payload.variables['active'];

      _lastModified = new DateTime.fromMillisecondsSinceEpoch(response.payload.variables['last_modified'] * 1000);
      completer.complete(new Response.success(_active));
      _onActiveChangeController.add(_active);

    });


    return new FutureResponse(completer.future);
  }

  FutureResponse<bool> activate() {
    if (active) {
      return new Future(() => active);
    }

    var completer = new Completer<Response<String>>();

    ajaxClient.callFunctionString(_domainLibraryGetter + ".activate().getInstance()").then((Response<JSONObject> response) {
      if (response.type != Response.RESPONSE_TYPE_SUCCESS) {
        completer.complete(response);
        return;
      }

      _active = response.payload.variables['active'];
      _lastModified = new DateTime.fromMillisecondsSinceEpoch(response.payload.variables['last_modified'] * 1000);
      completer.complete(new Response.success(_active));
      _onActiveChangeController.add(_active);
    });


    return new FutureResponse(completer.future);
  }

  FutureResponse<bool> toggleActive() => active ? deactivate() : activate();

  Stream<String> get onDescriptionChange =>
  _onDescriptionChangeStream == null ? _onDescriptionChangeStream = _onDescriptionChangeController.stream.asBroadcastStream() : _onDescriptionChangeStream;

  Stream<MailDomain> get onDelete {
    if (_onDeleteController == null) {
      _onDeleteController = new StreamController();
      domainLibrary.onRemove.listen((MailDomain d) {
        if (d != this) {
          return;
        }
        _onDeleteController.add(d);
      });

    }

    if (_onDeleteStream == null) {
      _onDeleteStream = _onDeleteController.stream.asBroadcastStream();
    }

    return _onDeleteStream;
  }

  Stream<MailDomain> get onAliasTargetChange =>
  _onAliasTargetChangeStream == null ? _onAliasTargetChangeStream = _onAliasTargetChangeController.stream.asBroadcastStream() : _onAliasTargetChangeStream;

  Stream<bool> get onActiveChange =>
  _onActiveChangeStream == null ? _onActiveChangeStream = _onActiveChangeController.stream.asBroadcastStream() : _onActiveChangeStream;
}