appkr / timemachine by appkr

Laravel/Lumen application-level time setter for testing
23
2
3
Package Data
Maintainer Username: appkr
Maintainer Contact: juwonkim@me.com (appkr)
Package Create Date: 2017-06-02
Package Last Update: 2017-07-04
Language: PHP
License: MIT
Last Refreshed: 2024-11-21 03:01:40
Package Statistics
Total Downloads: 23
Monthly Downloads: 0
Daily Downloads: 0
Total Stars: 2
Total Watchers: 3
Total Forks: 1
Total Open Issues: 0

Latest Stable Version Total Downloads Latest Unstable Version License

Timemachine

Manipulates application(Laravel/Lumen) server's time arbitrarily for a given minutes.

CAVEAT

USE THIS ONLY FOR TEST PURPOSE. DO NOT MAKE THIS AVAILABLE IN PUBLICLY ACCESSIBLE SERVICES.

  • Provided apis are not protected by authz.
  • While setting is alive, it affects all time related functions of the application. e.g. created_at written in the DB tables.

1. Install

Pull the library to your project.

composer install appkr/timemachine 

Append service provider in the providers array.

<?php // config/app.php (Laravel)

return [
    'providers' => [
        Appkr\Timemachine\TimemachineServiceProvider::class,
    ],
];

// boostrap/app.php (Lumen)
$app->register(Appkr\Timemachine\TimemachineServiceProvider::class);

Optionally publish config.

php artisan vendor:publish --provider="Appkr\Timemachine\TimemachineServiceProvider"

2. How to use

There are three APIs. For conveniences, a Postman collection is provided.

2.1. GET /timemachine

Returns time diff from current server time when target_server_time parameter is given. Or print current server time when nothing is given.

GET /timemachine
Accept: application/json
Content-Type: application/json

field|type|required|description ---|---|---|--- target_server_time|date(Y-m-d H:i:s)|optional|e.g. 2017-06-01 12:05:00

HTTP/1.1 200 OK
Content-Type: application/json
Date: Thu, 01 Jun 2017 12:00:00 +0900

{
  "current_server_time": "2017-06-01T12:00:00+0900",
  "target_server_time": "2017-06-01T12:05:00+0900",
  "add_days": 0,
  "add_minutes": 5,
  "sub_days": null,
  "sub_minutes": null
}

2.2. PUT /timemachine

Manipulates server's time for the given ttl.

PUT /timemachine
Accept: application/json
Content-Type: application/json

{
    "add_minutes": 5,
    "ttl": 5
}

field|type|required|description ---|---|---|--- add_days|int|optional(max:365)|Number of days to add to current time sub_days|int|optional(max:365)|Number of days to subtract from current time add_minutes|int|optional(max:1440)|Number of minutes to add to current time sub_minutes|int|optional(max:1440)|Number of minutes to subtract from current time ttl|int|optional(default:5, max:60)|Number of minutes for settings to live

HTTP/1.1 200 OK
Content-Type: application/json
Date: Thu, 01 Jun 2017 12:00:00 +0900

{
  "current_server_time": "2017-06-01T12:00:00+0900",
  "message": "Success. The settings will be effective from next request on for 5 minutes."
}

2.3. DELETE /timemachine

Removes time setting and restore back to the machine time.

DELETE /timemachine
Accept: application/json
Content-Type: application/json
HTTP/1.1 200 OK
Content-Type: application/json
Date: Thu, 01 Jun 2017 12:00:00 +0900

{
  "current_server_time": "2017-06-01T12:00:00+0900",
  "message": "Success. Settings removed."
}

3. Sponsors

This library is a by-product of a company project. Thanks MeshKorea.

MeshKorea

Open source version was created using IntelliJ IDE sponsored by JetBrains.

JetBrains

4. Note on HTTP Date response header

In Nginx, Date header can be settable from application side. So the following was possible:

<?php

header('Date: ' . Carbon\Carbon::now()->addMinutes(5)->toRfc2822String());
echo $httpResponseBody;

While in Apache, it is not doable. https://laracasts.com/discuss/channels/servers/how-can-i-override-http-date-response-header-under-apache24