@userdashboard/maxmind-geoip

MaxMind GeoIP module for Dashboard

Usage no npm install needed!

<script type="module">
  import userdashboardMaxmindGeoip from 'https://cdn.skypack.dev/@userdashboard/maxmind-geoip';
</script>

README

Documentation for Maxmind GeoIP module

Index

Introduction

Dashboard bundles everything a web app needs, all the "boilerplate" like signing in and changing passwords, into a parallel server so you can write a much smaller web app.

MaxMind provide a database that converts IP addresses to countries and this module adds API routes for identifying the country by IP and a server handler that will automatically attach a Country object to each HttpRequest using their database. There is much more data in the MaxMind database than is exposed via the API, pull requests are welcome to add more routes to access it.

Module contents

Dashboard modules can add pages and API routes. For more details check the sitemap.txt and api.txt or env.txt also contained in the online documentation.

Content type
Proxy scripts
Server scripts Yes
Content scripts
User pages
User API routes Yes
Administrator pages
Administrator API routes

Import this module

Install the module with NPM:

$ npm install @userdashboard/maxmind-geoip

Edit your package.json to activate the module:

"dashboard": {
  "modules": [
    "@userdashboard/maxmind-geoip"
  ]
}

Access the API

Dashboard and official modules are completely API-driven and you can access the same APIs on behalf of the user making requests. You perform GET, POST, PATCH, and DELETE HTTP requests against the API endpoints to fetch or modify data. This example fetches the user's country information using NodeJS, you can do this with any language:

const country = await proxy(`/api/user/maxmind/country?ip=1.2.3.4`, accountid, sessionid)

const proxy = util.promisify((path, accountid, sessionid, callback) => {
    const requestOptions = {
        host: 'dashboard.example.com',
        path: path,
        port: '443',
        method: 'GET',
        headers: {
            'x-application-server': 'application.example.com',
            'x-application-server-token': process.env.APPLICATION_SERVER_TOKEN
        }
    }
    if (accountid) {
        requestOptions.headers['x-accountid'] = accountid
        requestOptions.headers['x-sessionid'] = sessionid
    }
    const proxyRequest = require('https').request(requestOptions, (proxyResponse) => {
        let body = ''
        proxyResponse.on('data', (chunk) => {
            body += chunk
        })
        return proxyResponse.on('end', () => {
            return callback(null, JSON.parse(body))
        })
    })
    proxyRequest.on('error', (error) => {
        return callback(error)
    })
    return proxyRequest.end()
  })
}