Add option to always unlock the premium version

This commit is contained in:
Jonas Lochmann 2020-08-03 02:00:00 +02:00
parent f8b4fc77a5
commit a73af1338e
No known key found for this signature in database
GPG key ID: 8B8C9AEE10FA5B36
8 changed files with 24 additions and 11 deletions

View file

@ -20,12 +20,13 @@ On a invalid request body: HTTP status code 400 Bad Request
If the mail auth token is invalid/ expired: HTTP status code 401 Unauthorized
On success: a object with the properties ``status`` (string), ``mail`` (string) and
``canCreateFamily`` (boolean)
On success: a object with the properties ``status`` (string), ``mail`` (string),
``canCreateFamily`` (boolean) and ``alwaysPro`` (boolean)
- ``status`` is ``with family`` or ``without family``
- ``mail`` is the mail address for which the auth token was created
- ``canCreateFamily`` is false if the sign up of new families was disabled and otherwise true
- ``alwaysPro`` is true if the premium version is always unlocked
## POST /parent/create-family

View file

@ -48,7 +48,9 @@
- DISABLE_SIGNUP
- ``yes`` or ``no`` (default: no)
- disables creating new families if ``yes`` is selected
- the default value is ``no``
- ALWAYS_PRO
- ``yes`` or ``no`` (default: ``no``)
- if ``yes``, then the features of the premium version are unlocked for all users
- PING_INTERVAL_SEC
- ping interval at the websocket in seconds
- the default value is ``25``

View file

@ -23,6 +23,7 @@ services:
PORT: 8080
MAIL_SENDER: me@my.timelimit.server
MAIL_TRANSPORT: '{"host": "localhost", "port": 25}'
ALWAYS_PRO: yes
# put additional config variables here
ports:
- "8080:8080"
@ -68,6 +69,7 @@ services:
PORT: 8080
MAIL_SENDER: me@my.timelimit.server
MAIL_TRANSPORT: '{"host": "localhost", "port": 25}'
ALWAYS_PRO: yes
# put additional config variables here
restart: always
# you can enable logging during testing by commenting this out,

View file

@ -51,7 +51,8 @@ export const createParentRouter = ({ database, websocket }: {database: Database,
res.json({
status,
mail,
canCreateFamily: !config.disableSignup
canCreateFamily: !config.disableSignup,
alwaysPro: config.alwaysPro
})
} catch (ex) {
next(ex)

View file

@ -20,6 +20,7 @@ interface Config {
mailWhitelist: Array<string>
disableSignup: boolean
pingInterval: number
alwaysPro: boolean
}
function parseYesNo (value: string) {
@ -28,12 +29,13 @@ function parseYesNo (value: string) {
} else if (value === 'no') {
return false
} else {
throw new Error('invalid value "' + value + '", expected "" or "no"')
throw new Error('invalid value "' + value + '", expected "yes" or "no"')
}
}
export const config: Config = {
mailWhitelist: (process.env.MAIL_WHITELIST || '').split(',').map((item) => item.trim()).filter((item) => item.length > 0),
disableSignup: parseYesNo(process.env.DISABLE_SIGNUP || 'no'),
pingInterval: parseInt(process.env.PING_INTERVAL_SEC || '25', 10) * 1000
pingInterval: parseInt(process.env.PING_INTERVAL_SEC || '25', 10) * 1000,
alwaysPro: process.env.ALWAYS_PRO ? parseYesNo(process.env.ALWAYS_PRO) : false
}

View file

@ -1,6 +1,6 @@
/*
* server component for the TimeLimit App
* Copyright (C) 2019 Jonas Lochmann
* Copyright (C) 2019 - 2020 Jonas Lochmann
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
@ -17,6 +17,7 @@
import { Conflict, Unauthorized } from 'http-errors'
import * as Sequelize from 'sequelize'
import { config } from '../../config'
import { Database } from '../../database'
import { generateVersionId } from '../../util/token'
import { WebsocketApi } from '../../websocket'
@ -104,7 +105,7 @@ export const setPrimaryDevice = async ({ database, websocket, deviceAuthToken, c
hasFullVersion: familyEntryUnsafe.hasFullVersion
}
if (!familyEntry.hasFullVersion) {
if (!(familyEntry.hasFullVersion || config.alwaysPro)) {
return {
response: 'requires full version',
sourceDeviceId: deviceEntry.deviceId,

View file

@ -1,6 +1,6 @@
/*
* server component for the TimeLimit App
* Copyright (C) 2019 Jonas Lochmann
* Copyright (C) 2019 - 2020 Jonas Lochmann
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
@ -17,6 +17,7 @@
import { memoize, uniq } from 'lodash'
import * as Sequelize from 'sequelize'
import { config } from '../../../config'
import { VisibleConnectedDevicesManager } from '../../../connected-devices'
import { Database } from '../../../database'
import { generateVersionId } from '../../../util/token'
@ -49,7 +50,7 @@ export class Cache {
connectedDevicesManager: VisibleConnectedDevicesManager
}) {
this.familyId = familyId
this.hasFullVersion = hasFullVersion
this.hasFullVersion = hasFullVersion || config.alwaysPro
this.database = database
this.transaction = transaction
this.connectedDevicesManager = connectedDevicesManager

View file

@ -17,6 +17,7 @@
import { difference, filter, intersection } from 'lodash'
import * as Sequelize from 'sequelize'
import { config } from '../../config'
import { Database } from '../../database'
import { getStatusMessage } from '../../function/statusmessage'
import { ClientDataStatus } from '../../object/clientdatastatus'
@ -58,7 +59,9 @@ export const generateServerDataStatus = async ({ database, clientStatus, familyI
}
let result: ServerDataStatus = {
fullVersion: familyEntry.hasFullVersion ? parseInt(familyEntry.fullVersionUntil, 10) : 0,
fullVersion: config.alwaysPro ? 1 : (
familyEntry.hasFullVersion ? parseInt(familyEntry.fullVersionUntil, 10) : 0
),
message: await getStatusMessage({ database, transaction }) || undefined
}