Browse Source

made download count and expiry options server configurable

Danny Coates 6 years ago
parent
commit
e2259ae737

+ 3 - 2
app/templates/expireInfo/index.js

@@ -1,3 +1,4 @@
+/* globals DEFAULTS */
 const html = require('choo/html');
 const raw = require('choo/html/raw');
 const selectbox = require('../selectbox');
@@ -17,7 +18,7 @@ module.exports = function(state, emit) {
     return el;
   }
 
-  const counts = [1, 2, 3, 4, 5, 20, 50, 100, 200].filter(
+  const counts = DEFAULTS.DOWNLOAD_COUNTS.filter(
     i => state.capabilities.account || i <= state.user.maxDownloads
   );
 
@@ -40,7 +41,7 @@ module.exports = function(state, emit) {
     dlCountSelect
   );
 
-  const expires = [300, 3600, 86400, 604800].filter(
+  const expires = DEFAULTS.EXPIRE_TIMES_SECONDS.filter(
     i => state.capabilities.account || i <= state.user.maxExpireSeconds
   );
 

+ 1 - 0
package.json

@@ -29,6 +29,7 @@
     "test-integration": "docker-compose up --abort-on-container-exit --exit-code-from integration-tests --build --remove-orphans --quiet-pull && docker-compose down",
     "test-integration-stage": "cross-env BASE_URL=https://send.stage.mozaws.net npm run test-integration",
     "start": "npm run clean && cross-env NODE_ENV=development FXA_CLIENT_ID=fced6b5e3f4c66b9 BASE_URL=http://localhost:8080 webpack-dev-server --mode=development",
+    "android": "cross-env ANDROID=1 npm start",
     "prod": "node server/bin/prod.js"
   },
   "lint-staged": {

+ 5 - 10
server/config.js

@@ -9,16 +9,6 @@ const conf = convict({
     default: '',
     env: 'S3_BUCKET'
   },
-  num_of_prefixes: {
-    format: Number,
-    default: 5,
-    env: 'NUM_OF_PREFIXES'
-  },
-  expire_prefixes: {
-    format: Array,
-    default: ['5minutes', '1hour', '1day', '1week', '2weeks'],
-    env: 'EXPIRE_PREFIXES'
-  },
   expire_times_seconds: {
     format: Array,
     default: [300, 3600, 86400, 604800],
@@ -39,6 +29,11 @@ const conf = convict({
     default: 86400,
     env: 'ANON_MAX_EXPIRE_SECONDS'
   },
+  download_counts: {
+    format: Array,
+    default: [1, 2, 3, 4, 5, 20, 50, 100, 200],
+    env: 'DOWNLOAD_COUNTS'
+  },
   max_downloads: {
     format: Number,
     default: 200,

+ 2 - 0
server/routes/jsconfig.js

@@ -55,6 +55,8 @@ module.exports = async function(req, res) {
     MAX_ARCHIVES_PER_USER: ${config.max_archives_per_user}
   };
   var DEFAULTS = {
+    DOWNLOAD_COUNTS: ${JSON.stringify(config.download_counts)},
+    EXPIRE_TIMES_SECONDS: ${JSON.stringify(config.expire_times_seconds)},
     EXPIRE_SECONDS: ${config.default_expire_seconds}
   };
   ${authConfig};

+ 5 - 8
server/storage/index.js

@@ -3,6 +3,10 @@ const Metadata = require('../metadata');
 const mozlog = require('../log');
 const createRedisClient = require('./redis');
 
+function getPrefix(seconds) {
+  return Math.max(Math.floor(seconds / 86400), 1);
+}
+
 class DB {
   constructor(config) {
     const Storage = config.s3_bucket ? require('./s3') : require('./fs');
@@ -37,14 +41,7 @@ class DB {
   }
 
   async set(id, file, meta, expireSeconds = config.default_expire_seconds) {
-    const expireTimes = config.expire_times_seconds;
-    let i;
-    for (i = 0; i < expireTimes.length - 1; i++) {
-      if (expireSeconds <= expireTimes[i]) {
-        break;
-      }
-    }
-    const prefix = config.expire_prefixes[i];
+    const prefix = getPrefix(expireSeconds);
     const filePath = `${prefix}-${id}`;
     await this.storage.set(filePath, file);
     this.redis.hset(id, 'prefix', prefix);

+ 6 - 8
test/backend/storage-tests.js

@@ -23,8 +23,6 @@ class MockStorage {
 const config = {
   s3_bucket: 'foo',
   default_expire_seconds: 20,
-  num_of_prefixes: 3,
-  expire_prefixes: ['ten', 'twenty', 'thirty'],
   expire_times_seconds: [10, 20, 30],
   env: 'development',
   redis_host: 'localhost'
@@ -71,19 +69,19 @@ describe('Storage', function() {
     });
 
     it('adds right prefix based on expire time', async function() {
-      await storage.set('x', null, { foo: 'bar' }, 10);
+      await storage.set('x', null, { foo: 'bar' }, 300);
       const path_x = await storage.getPrefixedId('x');
-      assert.equal(path_x, 'ten-x');
+      assert.equal(path_x, '1-x');
       await storage.del('x');
 
-      await storage.set('y', null, { foo: 'bar' }, 11);
+      await storage.set('y', null, { foo: 'bar' }, 86400);
       const path_y = await storage.getPrefixedId('y');
-      assert.equal(path_y, 'twenty-y');
+      assert.equal(path_y, '1-y');
       await storage.del('y');
 
-      await storage.set('z', null, { foo: 'bar' }, 33);
+      await storage.set('z', null, { foo: 'bar' }, 86400 * 7);
       const path_z = await storage.getPrefixedId('z');
-      assert.equal(path_z, 'thirty-z');
+      assert.equal(path_z, '7-z');
       await storage.del('z');
     });