mirror of
https://codeberg.org/timelimit/timelimit-server.git
synced 2025-10-03 17:59:24 +02:00
Add option to always unlock the premium version
This commit is contained in:
parent
f8b4fc77a5
commit
a73af1338e
8 changed files with 24 additions and 11 deletions
|
@ -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
|
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
|
On success: a object with the properties ``status`` (string), ``mail`` (string),
|
||||||
``canCreateFamily`` (boolean)
|
``canCreateFamily`` (boolean) and ``alwaysPro`` (boolean)
|
||||||
|
|
||||||
- ``status`` is ``with family`` or ``without family``
|
- ``status`` is ``with family`` or ``without family``
|
||||||
- ``mail`` is the mail address for which the auth token was created
|
- ``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
|
- ``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
|
## POST /parent/create-family
|
||||||
|
|
||||||
|
|
|
@ -48,7 +48,9 @@
|
||||||
- DISABLE_SIGNUP
|
- DISABLE_SIGNUP
|
||||||
- ``yes`` or ``no`` (default: no)
|
- ``yes`` or ``no`` (default: no)
|
||||||
- disables creating new families if ``yes`` is selected
|
- 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_SEC
|
||||||
- ping interval at the websocket in seconds
|
- ping interval at the websocket in seconds
|
||||||
- the default value is ``25``
|
- the default value is ``25``
|
||||||
|
|
|
@ -23,6 +23,7 @@ services:
|
||||||
PORT: 8080
|
PORT: 8080
|
||||||
MAIL_SENDER: me@my.timelimit.server
|
MAIL_SENDER: me@my.timelimit.server
|
||||||
MAIL_TRANSPORT: '{"host": "localhost", "port": 25}'
|
MAIL_TRANSPORT: '{"host": "localhost", "port": 25}'
|
||||||
|
ALWAYS_PRO: yes
|
||||||
# put additional config variables here
|
# put additional config variables here
|
||||||
ports:
|
ports:
|
||||||
- "8080:8080"
|
- "8080:8080"
|
||||||
|
@ -68,6 +69,7 @@ services:
|
||||||
PORT: 8080
|
PORT: 8080
|
||||||
MAIL_SENDER: me@my.timelimit.server
|
MAIL_SENDER: me@my.timelimit.server
|
||||||
MAIL_TRANSPORT: '{"host": "localhost", "port": 25}'
|
MAIL_TRANSPORT: '{"host": "localhost", "port": 25}'
|
||||||
|
ALWAYS_PRO: yes
|
||||||
# put additional config variables here
|
# put additional config variables here
|
||||||
restart: always
|
restart: always
|
||||||
# you can enable logging during testing by commenting this out,
|
# you can enable logging during testing by commenting this out,
|
||||||
|
|
|
@ -51,7 +51,8 @@ export const createParentRouter = ({ database, websocket }: {database: Database,
|
||||||
res.json({
|
res.json({
|
||||||
status,
|
status,
|
||||||
mail,
|
mail,
|
||||||
canCreateFamily: !config.disableSignup
|
canCreateFamily: !config.disableSignup,
|
||||||
|
alwaysPro: config.alwaysPro
|
||||||
})
|
})
|
||||||
} catch (ex) {
|
} catch (ex) {
|
||||||
next(ex)
|
next(ex)
|
||||||
|
|
|
@ -20,6 +20,7 @@ interface Config {
|
||||||
mailWhitelist: Array<string>
|
mailWhitelist: Array<string>
|
||||||
disableSignup: boolean
|
disableSignup: boolean
|
||||||
pingInterval: number
|
pingInterval: number
|
||||||
|
alwaysPro: boolean
|
||||||
}
|
}
|
||||||
|
|
||||||
function parseYesNo (value: string) {
|
function parseYesNo (value: string) {
|
||||||
|
@ -28,12 +29,13 @@ function parseYesNo (value: string) {
|
||||||
} else if (value === 'no') {
|
} else if (value === 'no') {
|
||||||
return false
|
return false
|
||||||
} else {
|
} else {
|
||||||
throw new Error('invalid value "' + value + '", expected "" or "no"')
|
throw new Error('invalid value "' + value + '", expected "yes" or "no"')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export const config: Config = {
|
export const config: Config = {
|
||||||
mailWhitelist: (process.env.MAIL_WHITELIST || '').split(',').map((item) => item.trim()).filter((item) => item.length > 0),
|
mailWhitelist: (process.env.MAIL_WHITELIST || '').split(',').map((item) => item.trim()).filter((item) => item.length > 0),
|
||||||
disableSignup: parseYesNo(process.env.DISABLE_SIGNUP || 'no'),
|
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
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* server component for the TimeLimit App
|
* 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
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU Affero General Public License as
|
* it under the terms of the GNU Affero General Public License as
|
||||||
|
@ -17,6 +17,7 @@
|
||||||
|
|
||||||
import { Conflict, Unauthorized } from 'http-errors'
|
import { Conflict, Unauthorized } from 'http-errors'
|
||||||
import * as Sequelize from 'sequelize'
|
import * as Sequelize from 'sequelize'
|
||||||
|
import { config } from '../../config'
|
||||||
import { Database } from '../../database'
|
import { Database } from '../../database'
|
||||||
import { generateVersionId } from '../../util/token'
|
import { generateVersionId } from '../../util/token'
|
||||||
import { WebsocketApi } from '../../websocket'
|
import { WebsocketApi } from '../../websocket'
|
||||||
|
@ -104,7 +105,7 @@ export const setPrimaryDevice = async ({ database, websocket, deviceAuthToken, c
|
||||||
hasFullVersion: familyEntryUnsafe.hasFullVersion
|
hasFullVersion: familyEntryUnsafe.hasFullVersion
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!familyEntry.hasFullVersion) {
|
if (!(familyEntry.hasFullVersion || config.alwaysPro)) {
|
||||||
return {
|
return {
|
||||||
response: 'requires full version',
|
response: 'requires full version',
|
||||||
sourceDeviceId: deviceEntry.deviceId,
|
sourceDeviceId: deviceEntry.deviceId,
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* server component for the TimeLimit App
|
* 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
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU Affero General Public License as
|
* it under the terms of the GNU Affero General Public License as
|
||||||
|
@ -17,6 +17,7 @@
|
||||||
|
|
||||||
import { memoize, uniq } from 'lodash'
|
import { memoize, uniq } from 'lodash'
|
||||||
import * as Sequelize from 'sequelize'
|
import * as Sequelize from 'sequelize'
|
||||||
|
import { config } from '../../../config'
|
||||||
import { VisibleConnectedDevicesManager } from '../../../connected-devices'
|
import { VisibleConnectedDevicesManager } from '../../../connected-devices'
|
||||||
import { Database } from '../../../database'
|
import { Database } from '../../../database'
|
||||||
import { generateVersionId } from '../../../util/token'
|
import { generateVersionId } from '../../../util/token'
|
||||||
|
@ -49,7 +50,7 @@ export class Cache {
|
||||||
connectedDevicesManager: VisibleConnectedDevicesManager
|
connectedDevicesManager: VisibleConnectedDevicesManager
|
||||||
}) {
|
}) {
|
||||||
this.familyId = familyId
|
this.familyId = familyId
|
||||||
this.hasFullVersion = hasFullVersion
|
this.hasFullVersion = hasFullVersion || config.alwaysPro
|
||||||
this.database = database
|
this.database = database
|
||||||
this.transaction = transaction
|
this.transaction = transaction
|
||||||
this.connectedDevicesManager = connectedDevicesManager
|
this.connectedDevicesManager = connectedDevicesManager
|
||||||
|
|
|
@ -17,6 +17,7 @@
|
||||||
|
|
||||||
import { difference, filter, intersection } from 'lodash'
|
import { difference, filter, intersection } from 'lodash'
|
||||||
import * as Sequelize from 'sequelize'
|
import * as Sequelize from 'sequelize'
|
||||||
|
import { config } from '../../config'
|
||||||
import { Database } from '../../database'
|
import { Database } from '../../database'
|
||||||
import { getStatusMessage } from '../../function/statusmessage'
|
import { getStatusMessage } from '../../function/statusmessage'
|
||||||
import { ClientDataStatus } from '../../object/clientdatastatus'
|
import { ClientDataStatus } from '../../object/clientdatastatus'
|
||||||
|
@ -58,7 +59,9 @@ export const generateServerDataStatus = async ({ database, clientStatus, familyI
|
||||||
}
|
}
|
||||||
|
|
||||||
let result: ServerDataStatus = {
|
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
|
message: await getStatusMessage({ database, transaction }) || undefined
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue