repo_description: Node.js based forum software built for the modern web
repo_topics: community forum javascript mongodb node nodebb nodejs postgresql redis socket-io websockets
code: 'use strict';
  
  const meta = require('../meta');
  const analytics = require('../analytics');
  const privileges = require('../privileges');
  const groups = require('../groups');
  
  const adminApi = module.exports;
  
  adminApi.updateSetting = async (caller, { setting, value }) => {
  	const ok = await privileges.admin.can('admin:settings', caller.uid);
  	if (!ok) {
  		throw new Error('[[error:no-privileges]]');
  	}
  
  	await meta.configs.set(setting, value);
  };
  
  adminApi.getAnalyticsKeys = async () => {
  	const keys = await analytics.getKeys();
  
  	// Sort keys alphabetically
  	return keys.sort((a, b) => (a < b ? -1 : 1));
  };
  
  adminApi.getAnalyticsData = async (caller, { set, until, amount, units }) => {
  	// Default returns views from past 24 hours, by hour
  	if (!amount) {
  		if (units === 'days') {
  			amount = 30;
  		} else {
  			amount = 24;
  		}
  	}
  	const getStats = units === 'days' ? analytics.getDailyStatsForSet : analytics.getHourlyStatsForSet;
  	return await getStats(`analytics:${set}`, parseInt(until, 10) || Date.now(), amount);
  };
  
  adminApi.listGroups = async () => {
  	// N.B. Returns all groups, even hidden. Beware of leakage.
  	// Access control handled at controller level
  
  	const payload = await groups.getNonPrivilegeGroups('groups:createtime', 0, -1, { ephemeral: false });
  	return { groups: payload };
  };
  