Skip to content
Snippets Groups Projects
equally_distributed.dart 2.07 KiB
import 'dart:async';

import 'package:api/model/payment/equally_distributed.dart';
import 'package:api/model/team.dart';
import 'package:api/model/user.dart';
import 'package:lib/lib.dart';

class EquallyDistributedApiEndpoint extends CheckedDbApiEndpoint<EquallyDistributedPayment, EquallyDistributedPayment> {
  final User requestingUser;
  final Iterable<Team> requestingUserTeams;

  @override
  Future<bool> Function(EquallyDistributedPayment) get createItemAllowed => _createItemAllowed;

  @override
  Future<bool> Function(EquallyDistributedPayment) get getItemAllowed => _getItemAllowed;

  @override
  Future<bool> Function(EquallyDistributedPayment, EquallyDistributedPayment) get updateItemAllowed => _updateItemAllowed;

  @override
  Future<bool> Function(EquallyDistributedPayment) get deleteItemAllowed => _deleteItemAllowed;
  
  EquallyDistributedApiEndpoint({
    required super.database,
    required super.itemFromRequest,
    required super.itemToResponse,
    required this.requestingUser,
    required this.requestingUserTeams,
  });

  Future<bool> _createItemAllowed(EquallyDistributedPayment item) {
    return Future.value(
      _isUserOwner(item)
      && _isUserInTeam(item)
      && _isAmountOk(item)
    );
  }

  Future<bool> _getItemAllowed(EquallyDistributedPayment item) {
    return Future.value(
      _isUserInTeam(item)
    );
  }

  Future<bool> _updateItemAllowed(EquallyDistributedPayment item, EquallyDistributedPayment originalItem) {
    return Future.value(
      item.id == originalItem.id
      && _isUserOwner(item)
      && _isUserOwner(originalItem)
      && _isUserInTeam(item)
      && _isAmountOk(item)
    );
  }

  Future<bool> _deleteItemAllowed(EquallyDistributedPayment item) {
    return Future.value(
      _isUserOwner(item)
    );
  }

  bool _isUserOwner(EquallyDistributedPayment item) {
    return item.paidBy == requestingUser.id;
  }

  bool _isUserInTeam(EquallyDistributedPayment item) {
    return requestingUserTeams.any((team) => team.id == item.teamId);
  }

  bool _isAmountOk(EquallyDistributedPayment item) {