Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Beta #175

Merged
merged 16 commits into from
Sep 14, 2024
Merged

Beta #175

Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
16 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
48 changes: 48 additions & 0 deletions db/migrations/20240822145150_update_queens.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
/**
* @param { import("knex").Knex } knex
* @returns { Promise<void> }
*/
export const up = function (knex) {
return knex
.transaction()
.then(async (trx) => {
const queens = await knex('queens')
.whereNotNull('hive_id')
.where('deleted', false)
.orderBy([
{ column: 'hive_id' },
{ column: 'move_date', order: 'desc' },
]);
let lastMoveDate = undefined;
let hiveId = undefined;
for (const queen of queens) {
if (hiveId !== queen.hive_id) {
hiveId = queen.hive_id;
lastMoveDate = undefined;
}
if (!lastMoveDate && queen.modus) {
lastMoveDate = queen.move_date;
}
if (lastMoveDate && queen.modus && queen.move_date < lastMoveDate) {
await trx('queens')
.update({
modus: false,
modus_date: lastMoveDate,
})
.where('id', queen.id);
}
if (lastMoveDate && queen.move_date < lastMoveDate) {
lastMoveDate = queen.move_date;
}
}
})
.catch(function (error) {
console.error(error);
});
};

/**
* @param { import("knex").Knex } knex
* @returns { Promise<void> }
*/
export const down = function (knex) {};
19 changes: 19 additions & 0 deletions db/migrations/20240823150104_alter_queens.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
/**
* @param { import("knex").Knex } knex
* @returns { Promise<void> }
*/
export const up = function (knex) {
return knex.schema.alterTable('queens', (t) => {
t.datetime('move_date').alter();
});
};

/**
* @param { import("knex").Knex } knex
* @returns { Promise<void> }
*/
export const down = function (knex) {
return knex.schema.alterTable('queens', (t) => {
t.date('move_date').alter();
});
};
19 changes: 19 additions & 0 deletions db/migrations/20240914104345_alter_movedates.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
/**
* @param { import("knex").Knex } knex
* @returns { Promise<void> }
*/
export const up = function (knex) {
return knex.schema.alterTable('movedates', (t) => {
t.index(['hive_id', 'date'], 'movedates_hive_id_date_idx');
});
};

/**
* @param { import("knex").Knex } knex
* @returns { Promise<void> }
*/
export const down = function (knex) {
return knex.schema.alterTable('queens', (t) => {
t.dropIndex('movedates_hive_id_date_idx');
});
};
20 changes: 20 additions & 0 deletions db/migrations/20240914104345_view_movedates_previous_apiary.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import { fileURLToPath } from 'url';
import { readFileSync } from 'fs';
/**
* @param { import("knex").Knex } knex
* @returns { Promise<void> }
*/
export const up = function (knex) {
let filename = fileURLToPath(import.meta.url);
filename = filename.replace('.js', '.sql');
const sql = readFileSync(filename, 'utf8');
return knex.raw(sql);
};

/**
* @param { import("knex").Knex } knex
* @returns { Promise<void> }
*/
export const down = function (knex) {
//return knex.raw('drop view movedates_previous_apiary');
};
20 changes: 20 additions & 0 deletions db/migrations/20240914104345_view_movedates_previous_apiary.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
CREATE VIEW movedates_previous_apiary AS
SELECT
current_move.id AS current_move_id,
current_move.date AS current_move_date,
current_move.hive_id,
previous_apiary.id AS previous_apiary_id,
previous_apiary.name AS previous_apiary_name
FROM (
SELECT
id,
date,
hive_id,
LAG(apiary_id) OVER (PARTITION BY hive_id ORDER BY date) AS previous_apiary_id
FROM
movedates
) AS current_move
LEFT JOIN
apiaries AS previous_apiary
ON
current_move.previous_apiary_id = previous_apiary.id;
33 changes: 33 additions & 0 deletions docker-compose.api-us.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
version: '3.8'
services:
btree-server:
container_name: btree-server
image: hannesoberreiter/btree_server:latest
restart: always
user: 'node' # connected volume logs must have write access as node user chown -R 1000:1000 logs
#entrypoint: [ "/bin/sh", "-c", "tail -f /dev/null" ]
environment:
ENVIRONMENT: production
IS_CHILD: false
volumes:
- ./env:/home/node/app/env
- ./logs:/home/node/app/logs
ports:
- '1339:8101'
logging:
driver: 'local'
networks:
- default
- web
labels:
- 'traefik.enable=true'
- 'traefik.http.routers.app.rule=Host(`us.api.btree.at`)'
- 'traefik.http.routers.app.middlewares=wwwredirect'

networks:
default:
external: true
name: database_btree-db-network
web:
external: true
name: container_web
11 changes: 8 additions & 3 deletions src/api/controllers/auth.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import {
discourseSecret,
env,
frontend,
serverLocation,
} from '../../config/environment.config.js';
import { autoFill } from '../utils/autofill.util.js';
import { Company } from '../models/company.model.js';
Expand Down Expand Up @@ -247,13 +248,17 @@ export default class AuthController {
result.name +
'&email=' +
result.email +
'&oauth=google',
'&oauth=google' +
'&server=' +
serverLocation,
),
);
}
} catch (e) {
req.log.error({ message: 'Error in google callback', error: e });
return reply.redirect(frontend + '/visitor/login?error=oauth');
return reply.redirect(
frontend + '/visitor/login?error=oauth&server=' + serverLocation,
);
}

const userAgent = buildUserAgent(req);
Expand Down Expand Up @@ -282,7 +287,7 @@ export default class AuthController {
req.log.error(e);
throw httpErrors[500]('Failed to create session');
}
reply.redirect(frontend + '/visitor/login');
reply.redirect(frontend + '/visitor/login&server=' + serverLocation);
return reply;
}
}
1 change: 0 additions & 1 deletion src/api/controllers/company.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -328,7 +328,6 @@ async function specialTypes() {
];

properties.map((property) => {
console.log(property);
for (const key of Object.keys(property)) {
const item = property[key];
if (item.type === 'boolean') {
Expand Down
21 changes: 21 additions & 0 deletions src/api/controllers/external.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,11 @@ import {
import { createInvoice } from '../utils/foxyoffice.util.js';
import { SOURCE } from '../../config/constants.config.js';
import { MailService } from '../../services/mail.service.js';
import {
isServerLocationValid,
serverLocation,
} from '../../config/environment.config.js';
import { Logger } from '../../services/logger.service.js';

export default class ExternalController {
static async ical(req: FastifyRequest, reply: FastifyReply) {
Expand Down Expand Up @@ -92,11 +97,15 @@ export default class ExternalController {
if (event.type === 'checkout.session.completed') {
let user_id: number;
let years = 1;
let server: string = 'eu';

try {
const reference = JSON.parse(object.client_reference_id);
user_id = reference.user_id;
years = reference.quantity ?? 1;
server = isServerLocationValid(reference.server)
? reference.server
: 'eu';
} catch (e) {
const mailer = MailService.getInstance();
mailer.sendRawMail(
Expand All @@ -108,6 +117,18 @@ export default class ExternalController {
throw httpErrors.InternalServerError();
}

if (serverLocation !== server) {
Logger.getInstance().log(
'info',
'Stripe Webhook - ignored wrong server',
{
server: server,
current: serverLocation,
},
);
return {};
}

let amount = 0;
try {
amount = parseFloat(object.amount_total as any) / 100;
Expand Down
2 changes: 1 addition & 1 deletion src/api/controllers/movedate.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ export default class MovedateController {
const { order, direction, offset, limit, q, filters } = req.query as any;
const query = Movedate.query()
.withGraphJoined(
'[hive, apiary, creator(identifier), editor(identifier)]',
'[hive, apiary, creator(identifier), editor(identifier), movedate_previous_apiary]',
)
.where({
'apiary.user_id': req.session.user.user_id,
Expand Down
41 changes: 40 additions & 1 deletion src/api/controllers/queen.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import { QueenDuration } from '../models/queen_duration.model.js';
import { Checkup } from '../models/checkup.model.js';
import { Harvest } from '../models/harvest.model.js';
import { FastifyReply, FastifyRequest } from 'fastify';
import Objection from 'objection';

export default class QueenController {
static async get(req: FastifyRequest, reply: FastifyReply) {
Expand Down Expand Up @@ -245,6 +246,9 @@ export default class QueenController {
user_id: req.session.user.user_id,
bee_id: req.session.user.bee_id,
});
if (hive_id && body.move_date) {
await inactivateOtherQueens(trx, hive_id, body.move_date);
}
result.push(res.id);
}
return result;
Expand All @@ -256,14 +260,19 @@ export default class QueenController {
const body = req.body as any;
const ids = body.ids;
const insert = { ...body.data };
console.log(insert);
if (insert.hive_id) {
insert.hive_id = insert.hive_id !== 'empty' ? insert.hive_id : null;
}
const result = await Queen.transaction(async (trx) => {
return await Queen.query(trx)
const res = await Queen.query(trx)
.patch({ ...insert, edit_id: req.session.user.bee_id })
.findByIds(ids)
.where('user_id', req.session.user.user_id);
if (insert.hive_id) {
await inactivateOtherQueens(trx, insert.hive_id, insert.move_date);
}
return res;
});
return result;
}
Expand Down Expand Up @@ -331,3 +340,33 @@ export default class QueenController {
return result;
}
}

/**
* @description If a new queen is added to a hive all other queens in the hive should be inactivated (RIP)
*/
async function inactivateOtherQueens(
trx: Objection.Transaction,
hive_id: number,
move_date: string,
) {
let lastMoveDate = new Date(move_date);
const queens = await Queen.query(trx)
.where('hive_id', hive_id)
.orderBy('move_date', 'desc');

for (const queen of queens) {
if (!queen.move_date) continue;
const curMoveDate = new Date(queen.move_date);
if (queen.modus && curMoveDate < lastMoveDate) {
await Queen.query(trx)
.patch({
modus: false,
modus_date: lastMoveDate.toISOString().split('T')[0],
})
.where('id', queen.id);
}
if (curMoveDate < lastMoveDate) {
lastMoveDate = curMoveDate;
}
}
}
13 changes: 11 additions & 2 deletions src/api/models/movedate.model.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,11 @@ import { Model } from 'objection';
import { Apiary } from './apiary.model.js';
import { Hive } from './hive.model.js';
import { MovedateCount } from './movedate_count.model.js';
import { MovedatePreviousApiary } from './movedate_previous_apiary.model.js';

export class Movedate extends ExtModel {
id!: number;
date!: Date;
date!: string;
apiary_id!: number;
hive_id!: number;
edit_id!: number;
Expand All @@ -27,7 +28,7 @@ export class Movedate extends ExtModel {
required: ['date', 'apiary_id', 'hive_id'],
properties: {
id: { type: 'integer' },
date: { type: 'string', format: 'date' },
date: { type: 'string', format: 'iso-date-time' },
edit_id: { type: 'integer' },
apiary_id: { type: 'integer' }, // Apiary FK
hive_id: { type: 'integer' }, // Hive FK
Expand Down Expand Up @@ -59,6 +60,14 @@ export class Movedate extends ExtModel {
to: 'movedates_counts.hive_id',
},
},
movedate_previous_apiary: {
relation: Model.BelongsToOneRelation,
modelClass: MovedatePreviousApiary,
join: {
from: 'movedates.id',
to: 'movedates_previous_apiary.current_move_id',
},
},
creator: {
relation: ExtModel.HasOneRelation,
modelClass: User,
Expand Down
Loading
Loading