# Golang URL Shortener (Work in Progress) [![Build Status](https://travis-ci.org/maxibanki/golang-url-shortener.svg?branch=master)](https://travis-ci.org/maxibanki/golang-url-shortener) [![GoDoc](https://godoc.org/github.com/maxibanki/golang-url-shortener?status.svg)](https://godoc.org/github.com/maxibanki/golang-url-shortener) [![Go Report Card](https://goreportcard.com/badge/github.com/maxibanki/golang-url-shortener)](https://goreportcard.com/report/github.com/maxibanki/golang-url-shortener) [![Coverage Status](https://coveralls.io/repos/github/maxibanki/golang-url-shortener/badge.svg?branch=master)](https://coveralls.io/github/maxibanki/golang-url-shortener?branch=master) [![License](https://img.shields.io/badge/License-MIT-blue.svg)](http://opensource.org/licenses/MIT) ## Main Features: - URL Shortening - Visitor Counting - URL deletion - Authorization System - High performance database with [bolt](https://github.com/boltdb/bolt) - [ShareX](https://github.com/ShareX/ShareX) integration - Easy Docker Deployment ## Server Installation ### Standard Since we don't provide prebuild binaries, you have to build it yourself. For that you need Golang and Git installed on your system. ```bash git clone https://github.com/maxibanki/golang-url-shortener # Clone repository cd golang-url-shortener # Go into it go get -v ./... # Fetch dependencies go build # Build executable ./golang-url-shortener # Run it ``` ### Docker Compose Only execute the [docker-compose.yml](docker-compose.yml) and adjust the environment variables to your needs. ### Configuration: The configuration is a yaml based file of key value pairs. It is located in the installation folder and is called `config.yml`: ```json { "General": { "DBPath": "main.db", "ListenAddr": ":8080", "ShortedIDLength": 4 }, "OAuth": { "Google": { "ClientID": "", "ClientSecret": "" } } } ``` ## Clients: ### General There is a mechanism integrated, that you can call the `POST` endpoints with the following techniques: - application/json - application/x-www-form-urlencoded - multipart/form-data ### [ShareX](https://github.com/ShareX/ShareX) Configuration This URL Shortener has fully support with ShareX. To use it, just import the configuration to your ShareX. For that you need to open the `Destination settings` => `Other / Custom uploaders` => `Import` => `From Clipboard` menu. After you've done this, you need to set it as your standard URL Shortener. For that go back into your main menu => `Destinations` => `URL Shortener` => `Custom URL Shortener`. ```json { "Name": "Golang URL Shortener", "DestinationType": "URLShortener", "RequestType": "POST", "RequestURL": "http://127.0.0.1:8080/api/v1/create", "Arguments": { "URL": "$input$" }, "ResponseType": "Text", "URL": "$json:URL$" } ``` ### Curl #### Create ```bash curl -X POST -H 'Content-Type: application/json' -d '{"URL":"https://www.google.de/"}' http://127.0.0.1:8080/api/v1/create ``` ```json { "URL": "http://127.0.0.1:8080/dgUV", } ``` #### Info ```bash $ curl -X POST -H 'Content-Type: application/json' -d '{"ID":"dgUV"}' http://127.0.0.1:8080/api/v1/info ``` ```json { "URL": "https://google.com/", "VisitCount": 1, "CreatedOn": "2017-10-29T23:35:48.2977548+01:00", "LastVisit": "2017-10-29T23:36:14.193236+01:00" } ``` ### HTTP Endpoints: #### `/api/v1/create` POST Create is the handler for creating entries, you need to provide only an `URL`. The response will always be JSON encoded and contain an URL with the short link. #### `/api/v1/info` POST This handler returns the information about an entry. This includes: - Created At - Last Visit - Visitor counter For that you need to send a field `ID` to the backend. ## Why did you built this? Just only because I want to extend my current self hosted URL shorter and learn about new techniques like Go unit testing and react. ## TODO Next changes sorted by priority - [x] Fix handler unit tests - [x] Switch configuration to Yaml - [ ] Add Authorization (oAuth2 e.g. Google) - [ ] Add Deletion functionality (depends on the authorization) - [ ] Refactore Unit Tests - [ ] Performance optimization - [ ] Update configuration - [ ] Increase code coverage - [ ] Add ability to track the visitors (Referrer, maybe also live) - [ ] Create Makefile for building everything - [ ] Test docker-compose installation - [ ] Provide image on the docker hub https://console.cloud.google.com/