188 lines
		
	
	
	
		
			4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			188 lines
		
	
	
	
		
			4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
/*
 | 
						|
This file is part of Telegram Desktop,
 | 
						|
the official desktop application for the Telegram messaging service.
 | 
						|
 | 
						|
For license and copyright information please follow this link:
 | 
						|
https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
 | 
						|
*/
 | 
						|
#include "stripe/stripe_card.h"
 | 
						|
 | 
						|
#include "stripe/stripe_decode.h"
 | 
						|
 | 
						|
namespace Stripe {
 | 
						|
namespace {
 | 
						|
 | 
						|
CardBrand BrandFromString(const QString &brand) {
 | 
						|
	if (brand == "visa") {
 | 
						|
		return CardBrand::Visa;
 | 
						|
	} else if (brand == "american express") {
 | 
						|
		return CardBrand::Amex;
 | 
						|
	} else if (brand == "mastercard") {
 | 
						|
		return CardBrand::MasterCard;
 | 
						|
	} else if (brand == "discover") {
 | 
						|
		return CardBrand::Discover;
 | 
						|
	} else if (brand == "jcb") {
 | 
						|
		return CardBrand::JCB;
 | 
						|
	} else if (brand == "diners club") {
 | 
						|
		return CardBrand::DinersClub;
 | 
						|
	} else {
 | 
						|
		return CardBrand::Unknown;
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
CardFundingType FundingFromString(const QString &funding) {
 | 
						|
	if (funding == "credit") {
 | 
						|
		return CardFundingType::Credit;
 | 
						|
	} else if (funding == "debit") {
 | 
						|
		return CardFundingType::Debit;
 | 
						|
	} else if (funding == "prepaid") {
 | 
						|
		return CardFundingType::Prepaid;
 | 
						|
	} else {
 | 
						|
		return CardFundingType::Other;
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
} // namespace
 | 
						|
 | 
						|
Card::Card(
 | 
						|
	QString id,
 | 
						|
	QString last4,
 | 
						|
	CardBrand brand,
 | 
						|
	quint32 expMonth,
 | 
						|
	quint32 expYear)
 | 
						|
: _cardId(id)
 | 
						|
, _last4(last4)
 | 
						|
, _brand(brand)
 | 
						|
, _expMonth(expMonth)
 | 
						|
, _expYear(expYear) {
 | 
						|
}
 | 
						|
 | 
						|
Card Card::Empty() {
 | 
						|
	return Card(QString(), QString(), CardBrand::Unknown, 0, 0);
 | 
						|
}
 | 
						|
 | 
						|
Card Card::DecodedObjectFromAPIResponse(QJsonObject object) {
 | 
						|
	if (!ContainsFields(object, {
 | 
						|
		u"id",
 | 
						|
		u"last4",
 | 
						|
		u"brand",
 | 
						|
		u"exp_month",
 | 
						|
		u"exp_year"
 | 
						|
	})) {
 | 
						|
		return Card::Empty();
 | 
						|
	}
 | 
						|
 | 
						|
	const auto string = [&](QStringView key) {
 | 
						|
		return object.value(key).toString();
 | 
						|
	};
 | 
						|
	const auto cardId = string(u"id");
 | 
						|
	const auto last4 = string(u"last4");
 | 
						|
	const auto brand = BrandFromString(string(u"brand").toLower());
 | 
						|
	const auto expMonth = object.value("exp_month").toInt();
 | 
						|
	const auto expYear = object.value("exp_year").toInt();
 | 
						|
	auto result = Card(cardId, last4, brand, expMonth, expYear);
 | 
						|
	result._name = string(u"name");
 | 
						|
	result._dynamicLast4 = string(u"dynamic_last4");
 | 
						|
	result._funding = FundingFromString(string(u"funding").toLower());
 | 
						|
	result._fingerprint = string(u"fingerprint");
 | 
						|
	result._country = string(u"country");
 | 
						|
	result._currency = string(u"currency");
 | 
						|
	result._addressLine1 = string(u"address_line1");
 | 
						|
	result._addressLine2 = string(u"address_line2");
 | 
						|
	result._addressCity = string(u"address_city");
 | 
						|
	result._addressState = string(u"address_state");
 | 
						|
	result._addressZip = string(u"address_zip");
 | 
						|
	result._addressCountry = string(u"address_country");
 | 
						|
 | 
						|
	// TODO incomplete, not used.
 | 
						|
	//result._allResponseFields = object;
 | 
						|
 | 
						|
	return result;
 | 
						|
}
 | 
						|
 | 
						|
QString Card::cardId() const {
 | 
						|
	return _cardId;
 | 
						|
}
 | 
						|
 | 
						|
QString Card::name() const {
 | 
						|
	return _name;
 | 
						|
}
 | 
						|
 | 
						|
QString Card::last4() const {
 | 
						|
	return _last4;
 | 
						|
}
 | 
						|
 | 
						|
QString Card::dynamicLast4() const {
 | 
						|
	return _dynamicLast4;
 | 
						|
}
 | 
						|
 | 
						|
CardBrand Card::brand() const {
 | 
						|
	return _brand;
 | 
						|
}
 | 
						|
 | 
						|
CardFundingType Card::funding() const {
 | 
						|
	return _funding;
 | 
						|
}
 | 
						|
 | 
						|
QString Card::fingerprint() const {
 | 
						|
	return _fingerprint;
 | 
						|
}
 | 
						|
 | 
						|
QString Card::country() const {
 | 
						|
	return _country;
 | 
						|
}
 | 
						|
 | 
						|
QString Card::currency() const {
 | 
						|
	return _currency;
 | 
						|
}
 | 
						|
 | 
						|
quint32 Card::expMonth() const {
 | 
						|
	return _expMonth;
 | 
						|
}
 | 
						|
 | 
						|
quint32 Card::expYear() const {
 | 
						|
	return _expYear;
 | 
						|
}
 | 
						|
 | 
						|
QString Card::addressLine1() const {
 | 
						|
	return _addressLine1;
 | 
						|
}
 | 
						|
 | 
						|
QString Card::addressLine2() const {
 | 
						|
	return _addressLine2;
 | 
						|
}
 | 
						|
 | 
						|
QString Card::addressCity() const {
 | 
						|
	return _addressCity;
 | 
						|
}
 | 
						|
 | 
						|
QString Card::addressState() const {
 | 
						|
	return _addressState;
 | 
						|
}
 | 
						|
 | 
						|
QString Card::addressZip() const {
 | 
						|
	return _addressZip;
 | 
						|
}
 | 
						|
 | 
						|
QString Card::addressCountry() const {
 | 
						|
	return _addressCountry;
 | 
						|
}
 | 
						|
 | 
						|
bool Card::empty() const {
 | 
						|
	return _cardId.isEmpty();
 | 
						|
}
 | 
						|
 | 
						|
QString CardBrandToString(CardBrand brand) {
 | 
						|
	switch (brand) {
 | 
						|
	case CardBrand::Amex: return "American Express";
 | 
						|
	case CardBrand::DinersClub: return "Diners Club";
 | 
						|
	case CardBrand::Discover: return "Discover";
 | 
						|
	case CardBrand::JCB: return "JCB";
 | 
						|
	case CardBrand::MasterCard: return "MasterCard";
 | 
						|
	case CardBrand::Unknown: return "Unknown";
 | 
						|
	case CardBrand::Visa: return "Visa";
 | 
						|
	}
 | 
						|
	std::abort();
 | 
						|
}
 | 
						|
 | 
						|
} // namespace Stripe
 |