Skip to content

Commit

Permalink
feat: add posthog (closes #220) (#221)
Browse files Browse the repository at this point in the history
  • Loading branch information
gempain authored Apr 2, 2021
1 parent b14f1ab commit 5995fbb
Show file tree
Hide file tree
Showing 34 changed files with 362 additions and 57 deletions.
1 change: 1 addition & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ WORKDIR /app/server

ENV MELI_URL_INTERNAL=http://localhost:3001
ENV MELI_UI_DIR=/app/ui
ENV MELI_POSTHOG_ENABLED="true"

# Caddy defaults, copied from official Dockerfile
# https://github.com/caddyserver/caddy-docker/blob/2093c4a571bfe356447008d229195eb7063232b2/2.3/alpine/Dockerfile
Expand Down
3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,8 @@
"build:ui": "npm run build --prefix ui",
"test": "npm run test:ui",
"test:ui": "npm run test --prefix server",
"lint": "npm run lint --prefix server"
"lint": "npm run lint --prefix server",
"lint:fix": "npm run lint:fix --prefix server"
},
"keywords": [
"meli",
Expand Down
73 changes: 71 additions & 2 deletions server/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions server/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,7 @@
"passport-custom": "^1.1.1",
"passport-google-oauth20": "^2.0.0",
"passport-oauth2": "^1.5.0",
"posthog-node": "^1.0.7",
"prom-client": "^12.0.0",
"qs": "^6.9.4",
"queue": "^6.0.1",
Expand Down
2 changes: 1 addition & 1 deletion server/src/auth/handlers/get-auth-methods.spec.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import request from 'supertest';
import { MeliServer } from '../../server';
import { MeliServer } from '../../createServer';
import { spyOnVerifyToken } from '../../../tests/utils/spyon-verifytoken';
import { testServer } from '../../../tests/test-server';
import { authMethods } from '../passport/auth-methods';
Expand Down
2 changes: 1 addition & 1 deletion server/src/auth/handlers/sign-out.spec.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import request from 'supertest';
import { MeliServer } from '../../server';
import { MeliServer } from '../../createServer';
import { spyOnVerifyToken } from '../../../tests/utils/spyon-verifytoken';
import { testServer } from '../../../tests/test-server';

Expand Down
8 changes: 5 additions & 3 deletions server/src/server.ts → server/src/createServer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import cors from 'cors';
import express, { Express } from 'express';
import rateLimit from 'express-rate-limit';
import helmet from 'helmet';
import { createServer, Server } from 'http';
import { createServer as createHttpServer, Server } from 'http';
import morgan from 'morgan';
import passport from 'passport';
import { Logger } from './commons/logger/logger';
Expand All @@ -24,6 +24,7 @@ import { authorizeApiReq } from './auth/handlers/authorize-api-req';
import './auth/passport';
import { createIoServer } from './socket/create-io-server';
import { initSocketRooms } from './socket/socket-rooms';
import { initPosthog } from './posthog/init-posthog';

const logger = new Logger('meli.api:server');

Expand All @@ -50,8 +51,9 @@ export interface MeliServer {
stop: () => void;
}

export async function server(): Promise<MeliServer> {
export async function createServer(): Promise<MeliServer> {
await AppDb.init();
await initPosthog();
await migrate(AppDb.client, AppDb.db);
setupDbIndexes().catch(err => logger.error('Could not setup indexes indexes', err));
await configureCaddy();
Expand Down Expand Up @@ -89,7 +91,7 @@ export async function server(): Promise<MeliServer> {
app.use(Sentry.Handlers.errorHandler());
app.use(handleError);

const httpServer = createServer(app);
const httpServer = createHttpServer(app);
createIoServer(httpServer);

initSocketRooms();
Expand Down
8 changes: 4 additions & 4 deletions server/src/entities/orgs/handlers/create-org.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { testServer } from '../../../../tests/test-server';
import { spyOnCollection } from '../../../../tests/utils/spyon-collection';
import { spyOnVerifyToken } from '../../../../tests/utils/spyon-verifytoken';
import * as _emitEvent from '../../../events/emit-event';
import { MeliServer } from '../../../server';
import { MeliServer } from '../../../createServer';
import { User } from '../../users/user';

import request from 'supertest';
Expand Down Expand Up @@ -50,7 +50,7 @@ describe('createOrg', () => {
.post('/api/v1/orgs')
.set('Cookie', ['auth=testToken'])
.send({
name: 'Test Organization'
name: 'Test Organization',
});


Expand All @@ -75,7 +75,7 @@ describe('createOrg', () => {
userId: 'authenticatedUserId',
admin: true,
name: 'Authenticated User',
email: 'authenticated@test.tst'
email: 'authenticated@test.tst',
}));

expect(teams.insertOne).toHaveBeenCalled();
Expand All @@ -93,7 +93,7 @@ describe('createOrg', () => {
.post('/api/v1/orgs')
.set('Cookie', ['auth=testToken'])
.send({
name: 'Test Organization'
name: 'Test Organization',
});


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import { spyOnCollection } from '../../../../../tests/utils/spyon-collection';
import { spyOnIsAdminOrOwner } from '../../../../../tests/utils/spyon-isadminorowner';
import { AUTHENTICATED_USER_ID, spyOnVerifyToken } from '../../../../../tests/utils/spyon-verifytoken';
import * as _emitEvent from '../../../../events/emit-event';
import { MeliServer } from '../../../../server';
import { MeliServer } from '../../../../createServer';

// jest.mock('../../../../env/env', () => ({ env: testEnv }));

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import { spyOnCollection } from '../../../../../tests/utils/spyon-collection';
import { spyOnVerifyToken } from '../../../../../tests/utils/spyon-verifytoken';
import * as _configureSiteBranchInCaddy from '../../../../caddy/configuration';
import * as _emitEvent from '../../../../events/emit-event';
import { MeliServer } from '../../../../server';
import { MeliServer } from '../../../../createServer';
import * as _linkBranchToRelease from '../../link-branch-to-release';
import { linkBranchToRelease } from '../../link-branch-to-release';
import { EventType } from '../../../../events/event-type';
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import { spyOnVerifyToken } from '../../../../../tests/utils/spyon-verifytoken';
import * as _removeSiteBranchFromCaddy from '../../../../caddy/configuration';
import { removeSiteBranchFromCaddy } from '../../../../caddy/configuration';
import * as _emitEvent from '../../../../events/emit-event';
import { MeliServer } from '../../../../server';
import { MeliServer } from '../../../../createServer';
import { EventType } from '../../../../events/event-type';
import { canAdminSiteGuard } from '../../guards/can-admin-site-guard';
import { branchExistsGuard } from '../../guards/branch-exists-guard';
Expand Down
18 changes: 9 additions & 9 deletions server/src/entities/teams/handlers/sites/create-site.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import { spyOnIsAdminOrOwner } from '../../../../../tests/utils/spyon-isadminoro
import { AUTHENTICATED_USER_ID, spyOnVerifyToken } from '../../../../../tests/utils/spyon-verifytoken';
import * as _configureSiteInCaddy from '../../../../caddy/configuration';
import * as _emitEvent from '../../../../events/emit-event';
import { MeliServer } from '../../../../server';
import { MeliServer } from '../../../../createServer';

// jest.mock('../../../../env/env', () => ({ env: testEnv }));

Expand All @@ -27,7 +27,7 @@ describe('createSite', () => {
it('should create a site', async () => {
const teams = spyOnCollection('Teams', {
countDocuments: jest.fn().mockReturnValue(Promise.resolve(1)),
findOne: jest.fn().mockReturnValue(Promise.resolve({orgId: 'organization-id'})),
findOne: jest.fn().mockReturnValue(Promise.resolve({ orgId: 'organization-id' })),
});
const members = spyOnCollection('Members', {
countDocuments: jest.fn().mockReturnValue(Promise.resolve(1)),
Expand All @@ -43,7 +43,7 @@ describe('createSite', () => {
.post('/api/v1/teams/team-id/sites')
.set('Cookie', ['auth=testToken'])
.send({
name: 'test-site'
name: 'test-site',
});


Expand Down Expand Up @@ -79,19 +79,19 @@ describe('createSite', () => {
.post('/api/v1/teams/team-id/sites')
.set('Cookie', ['auth=testToken'])
.send({
name: 'test-site'
name: 'test-site',
});


expect(response.status).toEqual(404);
expect(teams.countDocuments).toHaveBeenCalledWith({_id: 'team-id'}, expect.anything());
expect(teams.countDocuments).toHaveBeenCalledWith({ _id: 'team-id' }, expect.anything());
});


it('should check if the user can administrate the team', async () => {
const teams = spyOnCollection('Teams', {
countDocuments: jest.fn().mockReturnValue(Promise.resolve(1)),
findOne: jest.fn().mockReturnValue(Promise.resolve({orgId: 'organization-id'})),
findOne: jest.fn().mockReturnValue(Promise.resolve({ orgId: 'organization-id' })),
});
const isAdminOrOwner = spyOnIsAdminOrOwner(false);

Expand All @@ -100,7 +100,7 @@ describe('createSite', () => {
.post('/api/v1/teams/team-id/sites')
.set('Cookie', ['auth=testToken'])
.send({
name: 'test-site'
name: 'test-site',
});


Expand All @@ -112,7 +112,7 @@ describe('createSite', () => {
it('should validate the site', async () => {
const teams = spyOnCollection('Teams', {
countDocuments: jest.fn().mockReturnValue(Promise.resolve(1)),
findOne: jest.fn().mockReturnValue(Promise.resolve({orgId: 'organization-id'})),
findOne: jest.fn().mockReturnValue(Promise.resolve({ orgId: 'organization-id' })),
});
const isAdminOrOwner = spyOnIsAdminOrOwner(true);

Expand All @@ -121,7 +121,7 @@ describe('createSite', () => {
.post('/api/v1/teams/team-id/sites')
.set('Cookie', ['auth=testToken'])
.send({
name: 'invalid site name'
name: 'invalid site name',
});

expect(response.status).toEqual(400);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import request from 'supertest';
import { testServer } from '../../../../../tests/test-server';
import { spyOnCollection } from '../../../../../tests/utils/spyon-collection';
import { spyOnVerifyToken } from '../../../../../tests/utils/spyon-verifytoken';
import { MeliServer } from '../../../../server';
import { MeliServer } from '../../../../createServer';
import * as _teamExistsGuard from '../../guards/team-exists-guard';
import * as _canReadTeamGuard from '../../guards/can-read-team-guard';
import * as _serializeSite from '../../../sites/serialize-site';
Expand Down
3 changes: 3 additions & 0 deletions server/src/env/env-spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -272,4 +272,7 @@ export const envSpec: EnvSpec<Env> = {
MELI_GOOGLE_RECAPTCHA_SECRET_KEY: {
schema: string().optional(),
},
MELI_POSTHOG_ENABLED: {
schema: boolean().optional().default(false),
},
};
1 change: 1 addition & 0 deletions server/src/env/env.ts
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@ export interface Env {
MELI_MULTER_FORM_LIMITS: MulterLimitOptions;
MELI_GOOGLE_RECAPTCHA_SITE_KEY: string;
MELI_GOOGLE_RECAPTCHA_SECRET_KEY: string;
MELI_POSTHOG_ENABLED: boolean;
}

export const env: Env = parseEnv(envSpec);
Expand Down
4 changes: 2 additions & 2 deletions server/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ require('source-map-support/register');
require('dotenv/config');
require('./commons/force-chalk-colors');

const { server } = require('./server');
const { createServer } = require('./createServer');

// eslint-disable-next-line no-console
server().catch(console.error);
createServer().catch(console.error);
Loading

0 comments on commit 5995fbb

Please sign in to comment.