moirei/saas-metre

一个用于管理您SaaS服务客户端使用的简单包。

1.1.0 2022-06-01 14:57 UTC

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);

💚 特点

  • 跟踪 METEREDVOLUME 衡量(服务提供)。例如,跟踪用户每月下载次数和用户允许的存储空间(累积时间)。
  • 简单的周期使用累加器
  • 标签以进一步描述使用条目。也可以按标签测量使用情况。
  • Eloquent 兼容。

安装

composer require moirei/saas-metre

概念

Metre:Metre是SaaS服务使用量度量的容器。

Period:使用周期,表示您的每周、每月等的SaaS订阅或计费周期。

Measure:Metre上的度量功能,用于您的SaaS服务。例如,"user_accounts""audio_downloads"

度量类型:度量的类型。目前有METEREDVOLUME。计费度量的使用按周期计算。例如,如果您每周为用户提供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

获取使用

根据度量类型(METEREDVOLUME),如果计费,则计算当前周期的使用情况。如果容量,则计算所有时间的使用情况。

$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