moirei / saas-metre
一个用于管理您SaaS服务客户端使用的简单包。
1.1.0
2022-06-01 14:57 UTC
Requires
- php: ^8.0
- funeralzone/valueobjects: ^0.5.0
- illuminate/contracts: ^7|^8|^9
- illuminate/support: ^7|^8|^9
- laravel/helpers: ^1.5
- nesbot/carbon: ^2.58
- spatie/data-transfer-object: ^3.7
Requires (Dev)
- illuminate/database: ^9.15
- orchestra/testbench: ^7.5
- pestphp/pest: ^1.21
- pestphp/pest-plugin-laravel: ^1.2
This package is auto-updated.
Last update: 2024-08-29 05:56:02 UTC
README
此包是一个最小化和直接的解决方案,用于跟踪SaaS应用程序上的服务使用情况。
$metre = new Metre(); $metre->addMeasure('user_accounts'); $metre->increment('user_accounts'); $metre->increment('user_accounts', count: 2); $usage = $metre->usage('user_accounts'); expect($usage->count)->toEqual(3);
💚 特点
- 跟踪
METERED
和VOLUME
衡量(服务提供)。例如,跟踪用户每月下载次数和用户允许的存储空间(累积时间)。 - 简单的周期使用累加器
- 标签以进一步描述使用条目。也可以按标签测量使用情况。
- Eloquent 兼容。
安装
composer require moirei/saas-metre
概念
Metre:Metre是SaaS服务使用量度量的容器。
Period:使用周期,表示您的每周、每月等的SaaS订阅或计费周期。
Measure:Metre上的度量功能,用于您的SaaS服务。例如,"user_accounts"
,"audio_downloads"
。
度量类型:度量的类型。目前有METERED
和VOLUME
。计费度量的使用按周期计算。例如,如果您每周为用户提供10个MP3下载。另一方面,容量度量是针对所有时间计算的。例如,用户可能始终允许最多2个协作者。
度量限制 [int
]:用于限制度量的使用。
度量标签:标签使得能够对单个度量上的使用进行分类和分组。
使用
创建Metre
使用数组
use MOIREI\Metre\Objects\MeasureType; ... $metre = new Metre([ 'startOfPeriods' => now()->unix(), 'measures' => [ 'user_accounts' => [ 'type' => MeasureType::METERED, 'limit' => 100, 'defaultTags' => ['publisher'], ] ] ]);
从对象值创建
use MOIREI\Metre\Objects\MetreInput; use MOIREI\Metre\Objects\Measure; ... $metre = Metre::make( new MetreInput( startOfPeriods: now()->unix(), measures: [ new Measure( name: 'user_accounts', type: MeasureType::fromNative('VOLUME'), limit: 100, defaultTags: ['publisher'], ), ] ), );
逐步构建
$metre = new Metre(); // create a measure to limit the amount of "user accounts" $metre->addMeasure('user_accounts'); $metre->setMeasureType('user_accounts', MeasureType::fromNative('VOLUME')); // set volume since it defaults to "METERED" $metre->setMeasureLimit('user_accounts', 5); $metre->addMeasure('orders' type: MeasureType::fromNative('METERED'), defaultTags: ['sales'], );
增加使用
$metre->increment('user_accounts'); // increment usage $metre->increment('user_accounts', count: 2); // increment usage by 2
检查可用性
使用canUse
方法确定度量是否可用。返回bool
。
$metre->canUse('user_accounts'); $metre->canUse('user_accounts', count: 2); // If usable by 2 counts $metre->canUse('user_accounts', tags: [...], period: $period); // Check against tags and period
获取使用
根据度量类型(METERED
或VOLUME
),如果计费,则计算当前周期的使用情况。如果容量,则计算所有时间的使用情况。
$usage = $metre->usage('user_accounts'); $usage->count; // amount used $usage->limit; // measure/usage limit $usage->entries; // amount of entries $usage->percentage(); // get percentage used. Returns null if no limit is set
要获取设定时间内的使用情况,请提供一个周期。
$usage = $metre->usage('user_accounts', period: now()->subHours(12)->unix(), ); $usage = $metre->usage('user_accounts', period: [ now()->subDays(2)->unix(), // get usage from this time and ignore measure type now()->unix(), ], );
清除使用
$metre->clear(); // clear all $metre->clear('user_accounts'); // clear "user_accounts" $metre->clear('user_accounts', 'orders'); // clear "user_accounts" and "orders" $metre->clear(['user_accounts', 'orders']); // clear "user_accounts" and "orders" $metre->clear('unknown_measure'); // fails, "unknown_measure" doesnt exist
周期
开始新的周期
$metre->newPeriod(); // or start a new period for 2 hours from now $metre->newPeriod(now()->addHours(2));
标签
标签使得能够对单个度量上的使用进行分类和分组。例如,一个产品购买和一个票务购买都可能被认为是订单。然而,根据销售类型,您的用户的订阅可能根据类型计费。
$metre->setMeasureDefaultTags('orders', ['sales']); $metre->increment('orders', tags: ['product']); $metre->increment('orders', tags: ['booking']); $metre->increment('orders', tags: ['ticket', 'booking']);
现在可以按度量标签检查使用情况
expect($metre->usage('orders')->count)->toEqual(3); expect($metre->usage('orders', tags: ['sales'])->count)->toEqual(3); expect($metre->usage('orders', tags: ['booking'])->count)->toEqual(2); expect($metre->usage('orders', tags: ['ticket'])->count)->toEqual(1);
使用Eloquent属性
要直接使用Eloquent,请使用提供的Caster。
... use MOIREI\Metre\MetreCaster; class Subscription extends Model { ... /** * The attributes that should be casted. * * @var array */ protected $casts = [ ... 'usage' => MetreCaster::class, ]; ... }
现在,根据使用状态执行用户操作
if($user->subscription->usage->canUse('monthly_npm3_downloads')){ $user->download($file); $user->subscription->usage->increment('monthly_npm3_downloads'); }
测试
./vendor/bin/pest