| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 |
- UserGetter = require "../User/UserGetter"
- request = require "request"
- settings = require "settings-sharelatex"
- logger = require "logger-sharelatex"
- { V1ConnectionError } = require "../Errors/Errors"
- module.exports = V1SubscriptionManager =
- # Returned planCode = 'v1_pro' | 'v1_pro_plus' | 'v1_student' | 'v1_free' | null
- # For this to work, we need plans in settings with plan-codes:
- # - 'v1_pro'
- # - 'v1_pro_plus'
- # - 'v1_student'
- # - 'v1_free'
- getPlanCodeFromV1: (userId, callback=(err, planCode)->) ->
- logger.log {userId}, "[V1SubscriptionManager] fetching v1 plan for user"
- V1SubscriptionManager._v1Request userId, {
- method: 'GET',
- url: (v1Id) -> "/api/v1/sharelatex/users/#{v1Id}/plan_code"
- }, (error, body) ->
- return callback(error) if error?
- planName = body?.plan_name
- logger.log {userId, planName, body}, "[V1SubscriptionManager] fetched v1 plan for user"
- if planName in ['pro', 'pro_plus', 'student', 'free']
- planName = "v1_#{planName}"
- else
- # Throw away 'anonymous', etc as being equivalent to null
- planName = null
- return callback(null, planName)
- notifyV1OfFeaturesChange: (userId, callback = (error) ->) ->
- V1SubscriptionManager._v1Request userId, {
- method: 'POST',
- url: (v1Id) -> "/api/v1/sharelatex/users/#{v1Id}/sync"
- }, callback
- getSubscriptionsFromV1: (userId, callback=(err, subscriptions) ->) ->
- V1SubscriptionManager._v1Request userId, {
- method: 'GET',
- url: (v1Id) -> "/api/v1/sharelatex/users/#{v1Id}/subscriptions"
- }, callback
- _v1Request: (userId, options, callback=(err, body)->) ->
- if !settings?.apis?.v1
- return callback null, null
- UserGetter.getUser userId, {'overleaf.id': 1}, (err, user) ->
- return callback(err) if err?
- v1Id = user?.overleaf?.id
- if !v1Id?
- logger.log {userId}, "[V1SubscriptionManager] no v1 id found for user"
- return callback(null, null)
- request {
- baseUrl: settings.apis.v1.url
- url: options.url(v1Id)
- method: options.method
- auth:
- user: settings.apis.v1.user
- pass: settings.apis.v1.pass
- sendImmediately: true
- json: true,
- timeout: 5 * 1000
- }, (error, response, body) ->
- if error?
- # Specially handle no connection err, so warning can be shown
- error = new V1ConnectionError('No V1 connection') if error.code == 'ECONNREFUSED'
- return callback(error)
- if 200 <= response.statusCode < 300
- return callback null, body
- else
- return callback new Error("non-success code from v1: #{response.statusCode}")
|