shlink/CHANGELOG.md
2019-02-26 22:58:03 +01:00

35 KiB

CHANGELOG

All notable changes to this project will be documented in this file.

The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.

1.16.1 - 2019-02-26

Added

  • Nothing

Changed

  • #363 Updated to shlinkio/php-coding-standard version 1.1.0

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • #362 Fixed all visits without an IP address being processed every time the visit:process command is executed.

1.16.0 - 2019-02-23

Added

  • #304 Added health endpoint to check healthiness of the service. Useful in container-based infrastructures.

    Call [GET /rest/health] in order to get a response like this:

    HTTP/1.1 200 OK
    Content-Type: application/health+json
    Content-Length: 681
    
    {
      "status": "pass",
      "version": "1.16.0",
      "links": {
        "about": "https://shlink.io",
        "project": "https://github.com/shlinkio/shlink"
      }
    }
    

    The status code can be 200 OK in case of success or 503 Service Unavailable in case of error, while the status property will be one of pass or fail, as defined in the Health check RFC.

  • #279 Added new findIfExists flag to the [POST /short-url] REST endpoint and the short-urls:generate CLI command. It can be used to return existing short URLs when found, instead of creating new ones.

    Thanks to this flag you won't need to remember if you created a short URL for a long one. It will just create it if needed or return the existing one if possible.

    The behavior might be a little bit counterintuitive when combined with other params. This is how the endpoint behaves when providing this new flag:

    • Only the long URL is provided: It will return the newest match or create a new short URL if none is found.
    • Long url and custom slug are provided: It will return the short URL when both params match, return an error when the slug is in use for another long URL, or create a new short URL otherwise.
    • Any of the above but including other params (tags, validSince, validUntil, maxVisits): It will behave the same as the previous two cases, but it will try to exactly match existing results using all the params. If any of them does not match, it will try to create a new short URL.
  • #336 Added an API test suite which performs API calls to an actual instance of the web service.

Changed

  • #342 The installer no longer asks for a charset to be provided, and instead, it shuffles the base62 charset.
  • #320 Replaced query builder by plain DQL for all queries which do not need to be dynamically generated.
  • #330 No longer allow failures on PHP 7.3 envs during project CI build.
  • #335 Renamed functional test suite to database test suite, since that better describes what it actually does.
  • #346 Extracted installer as an independent tool.
  • #261 Increased mutation score to 70%.

Deprecated

  • #351 Deprecated config:generate-charset and config:generate-secret CLI commands.

Removed

  • Nothing

Fixed

  • #317 Fixed error while trying to generate previews because of global config file being deleted by mistake by build script.
  • #307 Fixed memory leak while trying to process huge amounts of visits due to the query not being properly paginated.

1.15.1 - 2018-12-16

Added

  • #162 Added non-rest endpoints to swagger definition.

Changed

  • #312 Now all config files both in php and json format are loaded from config/params folder, easing users to provided customizations to docker image.
  • #226 Updated how table are rendered in CLI commands, making use of new features in Symfony 4.2.
  • #321 Extracted entities mappings from entities to external config files.
  • #308 Automated docker image building.

Deprecated

  • Nothing

Removed

Fixed

  • #309 Added missing favicon to prevent 404 errors logged when an error page is loaded in a browser.
  • #310 Fixed execution context not being properly detected, making CloseDbConnectionMiddlware to be always piped. Now the check is not even made, which simplifies everything.

1.15.0 - 2018-12-02

Added

  • #208 Added initial support to run shlink using swoole, a non-blocking IO server which improves the performance of shlink from 4 to 10 times.

    Run shlink with ./vendor/bin/zend-expressive-swoole start to start-up the service, which will be exposed in port 8080.

    Adding the -d flag, it will be started as a background service. Then you can use the ./vendor/bin/zend-expressive-swoole stop command in order to stop it.

  • #266 Added pagination to GET /short-urls/{shortCode}/visits endpoint.

    In order to make it backwards compatible, it keeps returning all visits by default, but it now allows to provide the page and itemsPerPage query parameters in order to configure the number of items to get.

Changed

  • #267 API responses and the CLI interface is no longer translated and uses english always. Only not found error templates are still translated.
  • #289 Extracted coding standard rules to a separated package.
  • #273 Improved code coverage in repository classes.

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • #278 Added missing X-Api-Key header to the list of valid cross domain headers.
  • #295 Fixed custom slugs so that they are case sensitive and do not try to lowercase provided values.

1.14.1 - 2018-11-17

Added

  • Nothing

Changed

  • #260 Increased mutation score to 65%.

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • #271 Fixed memory leak produced when processing high amounts of visits at the same time.
  • #272 Fixed errors produced when trying to process visits multiple times in parallel, by using a lock which ensures only one instance is run at a time.

1.14.0 - 2018-11-16

Added

  • #236 Added option to define a redirection to a custom URL when a user hits an invalid short URL.

    It only affects URLs matched as "short URL" where the short code is invalid, not any 404 that happens in the app. For example, a request to the path /foo/bar will keep returning a 404.

    This new option will be asked by the installer both for new shlink installations and for any previous shlink version which is updated.

  • #189 and #240 Added new GeoLite2-based geolocation service which is faster and more reliable than previous one.

    It does not have API limit problems, since it uses a local database file.

    Previous service is still used as a fallback in case GeoLite DB does not contain any IP address.

Changed

  • #241 Fixed columns in visit_locations table, to be snake_case instead of camelCase.
  • #228 Updated how exceptions are serialized into logs, by using monlog's PsrLogMessageProcessor.
  • #225 Performance and maintainability slightly improved by enforcing via code sniffer that all global namespace classes, functions and constants are explicitly imported.
  • #196 Reduced anemic model in entities, defining more expressive public APIs instead.
  • #249 Added functional-php to ease collections handling.
  • #253 Increased user_agent column length in visits table to 512.
  • #256 Updated to Infection v0.11.
  • #202 Added missing response examples to OpenAPI docs.

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • #223 Fixed PHPStan errors produced with symfony/console 4.1.5

1.13.2 - 2018-10-18

Added

  • #233 Added PHP 7.3 to build matrix allowing its failure.

Changed

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • #237 Solved errors when trying to geo-locate null IP addresses.

    Also improved how visitor IP addresses are discovered, thanks to akrabat/ip-address-middleware package.

1.13.1 - 2018-10-16

Added

  • Nothing

Changed

  • Nothing

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • #231 Fixed error when processing visits.

1.13.0 - 2018-10-06

Added

  • #197 Added cakephp/chronos library for date manipulations.

  • #214 Improved build script, which allows builds to be done without "jumping" outside the project directory, and generates smaller dist files.

    It also allows automating the dist file generation in travis-ci builds.

  • #207 Added two new config options which are asked during installation process. The config options already existed in previous shlink version, but you had to manually set their values.

    These are the new options:

    • Visits threshold to allow short URLs to be deleted.
    • Check the visits threshold when trying to delete a short URL via REST API.

Changed

  • #211 Extracted installer to its own module, which will simplify moving it to a separated package in the future.

  • #200 and #201 Renamed REST Action classes and CLI Command classes to use the concept of ShortUrl instead of the concept of ShortCode when referring to the entity, and left the short code concept to the identifier which is used as a unique code for a specific Short URL.

  • #181 When importing the configuration from a previous shlink installation, it no longer asks to import every block. Instead, it is capable of detecting only new config options introduced in the new version, and ask only for those.

    If no new options are found and you have selected to import config, no further questions will be asked and shlink will just import the old config.

Deprecated

  • #205 Deprecated [POST /authenticate] endpoint, and allowed any API request to be automatically authenticated using the X-Api-Key header with a valid API key.

    This effectively deprecates the Authorization: Bearer <JWT> authentication form, but it will keep working.

  • As of #200 and #201 REST urls have changed from /short-codes/... to /short-urls/..., and the command namespaces have changed from short-code:... to short-url:....

    In both cases, backwards compatibility has been retained and the old ones are aliases for the new ones, but the old ones are considered deprecated.

Removed

  • Nothing

Fixed

  • #203 Fixed some warnings thrown while unzipping distributable files.
  • #206 An error is now thrown during installation if any required param is left empty, making the installer display a message and ask again until a value is set.

1.12.0 - 2018-09-15

Added

  • #187 Included an API endpoint and a CLI command to delete short URLs.

    Due to the implicit danger of this operation, the deletion includes a safety check. URLs cannot be deleted if they have more than a specific amount of visits.

    The visits threshold is set to 15 by default and currently it has to be manually changed. In future versions the installation/update process will ask you about the value of the visits threshold.

    In order to change it, open the config/autoload/delete_short_urls.global.php file, which has this structure:

    return [
    
        'delete_short_urls' => [
            'visits_threshold' => 15,
            'check_visits_threshold' => true,
        ],
    
    ];
    

    Properties are self explanatory. Change check_visits_threshold to false to completely disable this safety check, and change the value of visits_threshold to allow short URLs with a different number of visits to be deleted.

    Once changed, delete the data/cache/app_config.php file (if any) to let shlink know about the new values.

    This check is implicit for the API endpoint, but can be "disabled" for the CLI command, which will ask you when trying to delete a URL which has reached to threshold in order to force the deletion.

  • #183 and #190 Included important documentation improvements in the repository itself. You no longer need to go to the website in order to see how to install or use shlink.

  • #186 Added a small robots.txt file that prevents 404 errors to be logged due to search engines trying to index the domain where shlink is located. Thanks to @robwent for the contribution.

Changed

  • #145 Shlink now obfuscates IP addresses from visitors by replacing the latest octet by 0, which does not affect geolocation and allows it to fulfil the GDPR.

    Other known services follow this same approach, like Google Analytics or Matomo

  • #182 The short URL creation API endpoints now return the same model used for lists and details endpoints.

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • #188 Shlink now allows multiple short URLs to be created that resolve to the same long URL.

1.11.0 - 2018-08-13

Added

  • #170 and #171 Updated [GET /short-codes] and [GET /short-codes/{shortCode}] endpoints to return more meaningful information and make their response consistent.

    The short URLs are now represented by this object in both cases:

    {
        "shortCode": "12Kb3",
        "shortUrl": "https://doma.in/12Kb3",
        "longUrl": "https://shlink.io",
        "dateCreated": "2016-05-01T20:34:16+02:00",
        "visitsCount": 1029,
        "tags": [
            "shlink"
        ],
        "originalUrl": "https://shlink.io"
    }
    

    The originalUrl property is considered deprecated and has been kept for backward compatibility purposes. It holds the same value as the longUrl property.

Changed

  • Nothing

Deprecated

  • The originalUrl property in [GET /short-codes] and [GET /short-codes/{shortCode}] endpoints is now deprecated and replaced by the longUrl property.

Removed

  • Nothing

Fixed

  • Nothing

1.10.2 - 2018-08-04

Added

  • Nothing

Changed

  • Nothing

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • #177 Fixed [GET] /short-codes endpoint returning a 500 status code when trying to filter by tags and searchTerm at the same time.

  • #175 Fixed error introduced in previous version, where you could end up banned from the service used to resolve IP address locations.

    In order to fix that, just fill this form including your server's IP address and your server should be unbanned.

    In order to prevent this, after resolving 150 IP addresses, shlink now waits 1 minute before trying to resolve any more addresses.

1.10.1 - 2018-08-02

Added

  • Nothing

Changed

  • #167 Shlink version is now set at build time to avoid older version numbers to be kept in newer builds.

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • #165 Fixed custom slugs failing when they are longer than 10 characters.

  • #166 Fixed unusual edge case in which visits were not properly counted when ordering by visit and filtering by search term in [GET] /short-codes API endpoint.

  • #174 Fixed geolocation not working due to a deprecation on used service.

  • #172 Documented missing filtering params for [GET] /short-codes/{shortCode}/visits API endpoint, which allow the list to be filtered by date range.

    For example: https://doma.in/rest/v1/short-urls/abc123/visits?startDate=2017-05-23&endDate=2017-10-05

  • #169 Fixed unhandled error when parsing ShortUrlMeta and date fields are already DateTime instances.

1.10.0 - 2018-07-09

Added

Changed

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • Nothing

1.9.1 - 2018-06-18

Added

  • #155 Improved the pagination object returned in lists, including more meaningful properties.

    • Old structure:
    {
      "pagination": {
        "currentPage": 1,
        "pagesCount": 2
      }
    }
    
    • New structure:
    {
      "pagination": {
        "currentPage": 2,
        "pagesCount": 13,
        "itemsPerPage": 10,
        "itemsInCurrentPage": 10,
        "totalItems": 126
      }
    }
    

Changed

  • Nothing

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • #154 Fixed sizes of every result page when filtering by searchTerm
  • #157 Background commands executed by installation process now respect the originally used php binary

1.9.0 - 2018-05-07

Added

  • #147 Allowed short URLs to be created on the fly using a single API request, including the API key in a query param.

    This eases integration with third party services.

    With this feature, a simple request to a URL like https://doma.in/rest/v1/short-codes/shorten?apiKey=[YOUR_API_KEY]&longUrl=[URL_TO_BE_SHORTENED] would return the shortened one in JSON or plain text format.

Changed

  • Nothing

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • #139 Ensured all core actions log exceptions

1.8.1 - 2018-04-07

Added

  • Nothing

Changed

  • #141 Removed workaround used in PathVersionMiddleware, since the bug in zend-stratigility has been fixed.

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • #140 Fixed warning thrown during installation while trying to include doctrine script

1.8.0 - 2018-03-29

Added

  • #125 Implemented a path which returns a 1px image instead of a redirection.

    Useful to track emails. Just add an image pointing to a URL like https://doma.in/abc123/track to any email and an invisible image will be generated tracking every time the email is opened.

  • #132 Added infection to improve tests

Changed

  • #130 Updated to Expressive 3
  • #137 Updated symfony components to v4

Deprecated

  • Nothing

Removed

  • #131 Dropped support for PHP 7

Fixed

  • Nothing

1.7.2 - 2018-03-26

Added

  • Nothing

Changed

  • Nothing

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • #135 Fixed PathVersionMiddleware being ignored when using expressive 2.2

1.7.1 - 2018-03-21

Added

  • Nothing

Changed

  • #128 Upgraded to expressive 2.2

    This will ease the upcoming update to expressive 3

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • #126 Fixed E_USER_DEPRECATED errors triggered when using Expressive 2.2

1.7.0 - 2018-01-21

Added

  • #88 Allowed tracking of short URLs to be disabled by including a configurable query param
  • #108 Allowed metadata to be defined when creating short codes

Changed

  • #113 Updated CLI commands to use SymfonyStyle
  • #112 Enabled Lazy loading in CLI commands
  • #117 Every module which throws exceptions has now its own ExceptionInterface extending Throwable
  • #115 Added phpstan to build matrix on PHP >=7.1 envs
  • #114 Replaced vlucas/phpdotenv dev requirement by symfony/dotenv

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • Nothing

1.6.2 - 2017-10-25

Added

  • Nothing

Changed

  • Nothing

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • #109 Fixed installation error due to typo in latest migration

1.6.1 - 2017-10-24

Added

  • Nothing

Changed

  • #110 Created .gitattributes file to define files to be excluded from distributable package

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • Nothing

1.6.0 - 2017-10-23

Added

  • #44 Now it is possible to set custom slugs for short URLs instead of using a generated short code
  • #47 Allowed to limit short URLs availability by date range
  • #48 Allowed to limit the number of visits to a short URL
  • #105 Added option to enable/disable URL validation by response status code

Changed

  • #27 Added repository functional tests with dbunit
  • #101 Now specific actions just capture very specific exceptions, and let the ErrorHandler catch any other unhandled exception
  • #104 Used different templates for requested-short-code-does-not-exist and route-could-not-be-match
  • #99 Replaced usages of AnnotatedFactory by ConfigAbstractFactory
  • #100 Updated templates engine. Replaced twig by plates
  • #102 Improved coding standards strictness

Deprecated

  • Nothing

Removed

  • #86 Dropped support for PHP 5

Fixed

  • #103 NotFoundDelegate now returns proper content types based on accepted content

1.5.0 - 2017-07-16

Added

  • #95 Added tags CRUD to CLI
  • #59 Added tags CRUD to REST
  • #66 Allowed certain information to be imported from and older shlink instance directory when updating

Changed

  • #96 Added namespace to functions
  • #76 Added response examples to swagger docs
  • #93 Improved cross domain management by using the ImplicitOptionsMiddleware

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • #92 Fixed formatted dates, using an ISO compliant format

1.4.0 - 2017-03-25

Added

  • Nothing

Changed

  • #89 Updated to expressive 2

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • Nothing

1.3.1 - 2017-01-22

Added

  • Nothing

Changed

  • #82 Enabled FastRoute routes cache
  • #85 Updated year in license file
  • #81 Added docker containers config

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • #83 Fixed short codes list: search in tags when filtering by query string
  • #79 Increased the number of followed redirects
  • #75 Applied PathVersionMiddleware only to rest routes defining it by configuration instead of code
  • #77 Allowed defining database server hostname and port

1.3.0 - 2016-10-23

Added

  • #67 Allowed to order the short codes list
  • #60 Accepted JSON requests in REST and used a body parser middleware to set the request's parsedBody
  • #72 When listing API keys from CLI, use yellow color for enabled keys that have expired
  • #58 Allowed to filter short URLs by tag
  • #69 Allowed to filter short URLs by text query
  • #73 Added tag-related endpoints to swagger file
  • #63 Added path versioning to REST API routes

Changed

  • #71 Separated swagger docs into multiple files

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • Nothing

1.2.2 - 2016-08-29

Added

  • Nothing

Changed

  • Nothing

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • Fixed minor bugs on CORS requests

1.2.1 - 2016-08-21

Added

  • Nothing

Changed

  • Nothing

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • #62 Fixed cross-domain requests in REST API

1.2.0 - 2016-08-21

Added

  • #45 Allowed to define tags on short codes, to improve filtering and classification
  • #7 Added website previews while listing available URLs
  • #57 Added database migrations system to improve updating between versions
  • #31 Added support for other database management systems by improving the EntityManager factory
  • #51 Generated build process to create app package and ease distribution
  • #38 Defined installation script. It will request dynamic data on the fly so that there is no need to define env vars
  • #55 Created update script which does not try to create a new database

Changed

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • #53 Fixed entities database interoperability
  • #52 Added missing htaccess file for apache environments

1.1.0 - 2016-08-09

Added

  • #46 Defined a route that returns a QR code representing the shortened URL.

    In order to get the QR code URL, use a pattern like https://doma.in/abc123/qr-code

  • #32 Added support for other cache adapters by improving the Cache factory

  • #14 Added logger and enabled errors logging

  • #13 Improved REST authentication

Changed

  • #41 Cached the "short code" => "URL" map to prevent extra DB hits
  • #39 Changed copyright from "Alejandro Celaya" to "Shlink" in error pages
  • #42 REST endpoints that need to find something now return a 404 when it is not found
  • #35 Updated CLI commands to use the same PHP namespace as the one used for the command name

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • #40 Taken into account the X-Forwarded-For header in order to get the visitor information, in case the server is behind a load balancer or proxy

1.0.0 - 2016-08-01

Added

  • #33 Created a command that generates a short code charset by randomizing the default one
  • #23 Translated application literals
  • #21 Allowed to filter visits by date range
  • #4 Added installation steps
  • #12 Improved code coverage

Changed

  • #15 HTTP requests now return JSON/HTML responses for errors (4xx and 5xx) based on Accept header
  • #22 Now visits locations data is saved on a visit_locations table
  • #20 Injected cross domain headers in response only if the Origin header is present in the request
  • #11 Separated code into multiple modules
  • #18 Grouped routable middleware in an Action namespace
  • #6 Project no longer depends on zendframework/zend-expressive-helpers package
  • #30 Replaced the "services" first level config entry by "dependencies", in order to fulfill default Expressive naming
  • #25 Replaced "Middleware" suffix on routable middlewares by "Action"
  • #19 Changed the vendor and app namespace from Acelaya\UrlShortener to Shlinkio\Shlink

Deprecated

  • Nothing

Removed

  • #36 Removed hhvm from the CI matrix since it doesn't support array constants and will fail

Fixed

  • #24 Prevented duplicated short codes errors because of the case insensitive behavior on MySQL

0.2.0 - 2016-08-01

Added

  • #8 Created a REST API
  • #10 Added more CLI functionality
  • #5 Created a CHANGELOG file

Changed

  • #9 Used symfony/console to dispatch console requests, instead of trying to integrate the process with expressive

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • Nothing