mirror of
https://codeberg.org/timelimit/timelimit-server.git
synced 2025-10-03 09:49:32 +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
|
||||
|
||||
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
|
||||
|
||||
|
|
|
@ -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``
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue