Skip to content

Commit

Permalink
Convert JS to TS (commits 7-13 of PR435) (#557)
Browse files Browse the repository at this point in the history
* util/index: convert js to ts

The languageModel & fiatModel interface created to type-check
the data and ensure that it conforms to
the expected structure and format.
This can help you avoid errors and bugs when
working with the data in your code.
This commit enables resolveJsonModule to import module
with '.json' extension.

Co-authored-by: webwarrior <[email protected]>

* jobs: convert js to ts

The --downlevelIteration flag is a TypeScript compiler
option that enables support for iterating over new
concepts like Map, Set, or Generator in older JavaScript
runtimes. By default, TypeScript targets ES3, which does
not support these features. If you use a for...of loop or
a spread operator on an iterable object, you may get an error.
Use Date instead of Date.toISOString cause paid_at has type
Date and during the conversion from js to ts,
we got compilation errors.

Co-authored-by: webwarrior <[email protected]>

* bot/start: fixing types & import/exports

Co-authored-by: webwarrior <[email protected]>

* bot/validation: convert js to ts

Using null instead of a boolean/undefined type is better.

* lnurl/lnurl-pay: convert js to ts

I had to change the '|', otherwise typescript would
complain this error msg:
```
The '|' operator is not allowed for boolean types.
Consider using '||' instead.
```

Co-authored-by: webwarrior <[email protected]>

* refactor: correcting a bad practice

* refactor: there's no need for isInt()

---------

Co-authored-by: Mehrshad <[email protected]>
  • Loading branch information
webwarrior-ws and Mersho authored Aug 28, 2024
1 parent 1ca8f7a commit a31ab63
Show file tree
Hide file tree
Showing 17 changed files with 346 additions and 240 deletions.
75 changes: 41 additions & 34 deletions bot/start.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,18 +4,17 @@ import { Message } from 'typegram'
import { UserDocument } from '../models/user'
import { FilterQuery } from 'mongoose';
const OrderEvents = require('./modules/events/orders');

const { limit } = require('@grammyjs/ratelimiter');
import { limit } from "@grammyjs/ratelimiter"
const schedule = require('node-schedule');
const {
import {
Order,
User,
PendingPayment,
Community,
Dispute,
Config,
} = require('../models');
const { getCurrenciesWithPrice, deleteOrderFromChannel, removeAtSymbol } = require('../util');
} from '../models';
import { getCurrenciesWithPrice, deleteOrderFromChannel, removeAtSymbol } from '../util';
const {
commandArgsMiddleware,
stageMiddleware,
Expand Down Expand Up @@ -55,32 +54,34 @@ const {
validateLightningAddress,
} = require('./validations');
import * as messages from './messages';
const {
import {
attemptPendingPayments,
cancelOrders,
deleteOrders,
calculateEarnings,
attemptCommunitiesPendingPayments,
deleteCommunity,
nodeInfo,
} = require('../jobs');
const { logger } = require('../logger');
} from '../jobs';
import { logger } from "../logger";
import { ICommunity, IUsernameId } from '../models/community';

export interface MainContext extends Context {
match: Array<string> | null;
i18n: I18nContext;
user: UserDocument;
admin: UserDocument;
}

interface OrderQuery {
export interface OrderQuery {
status?: string;
buyer_id?: string;
seller_id?: string;
}

const askForConfirmation = async (user: UserDocument, command: string) => {
try {
let orders = [];
let orders: any[] = [];
if (command === '/cancel') {
const where: FilterQuery<OrderQuery> = {
$and: [
Expand Down Expand Up @@ -133,6 +134,7 @@ const askForConfirmation = async (user: UserDocument, command: string) => {
return orders;
} catch (error) {
logger.error(error);
return null;
}
};

Expand All @@ -145,7 +147,7 @@ has the same condition.
The problem mentioned above is similar to this issue:
https://github.com/telegraf/telegraf/issues/1319#issuecomment-766360594
*/
const ctxUpdateAssertMsg = "ctx.update.message.text is not available.";
export const ctxUpdateAssertMsg = "ctx.update.message.text is not available.";

const initialize = (botToken: string, options: Partial<Telegraf.Options<MainContext>>): Telegraf<MainContext> => {
const i18n = new I18n({
Expand Down Expand Up @@ -215,7 +217,7 @@ const initialize = (botToken: string, options: Partial<Telegraf.Options<MainCont
const [val] = await validateParams(ctx, 2, '\\<_on/off_\\>');
if (!val) return;
let config = await Config.findOne();
if (!config) {
if (config === null) {
config = new Config();
}
config.maintenance = false;
Expand Down Expand Up @@ -262,11 +264,11 @@ const initialize = (botToken: string, options: Partial<Telegraf.Options<MainCont
throw new Error(ctxUpdateAssertMsg);
}
const params = ctx.update.message.text.split(' ');
const [command, orderId] = params.filter((el) => el);
const [command, orderId] = params.filter((el: string) => el);

if (!orderId) {
const orders = await askForConfirmation(ctx.user, command);
if (!orders.length) return await ctx.reply(`${command} <order Id>`);
if (orders === null || orders.length === 0) return await ctx.reply(`${command} <order Id>`);

return await messages.showConfirmationButtons(ctx, orders, command);
} else if (!(await validateObjectId(ctx, orderId))) {
Expand Down Expand Up @@ -325,7 +327,7 @@ const initialize = (botToken: string, options: Partial<Telegraf.Options<MainCont
if (!(await validateObjectId(ctx, orderId))) return;
const order = await Order.findOne({ _id: orderId });

if (!order) return;
if (order === null) return;

// We look for a dispute for this order
const dispute = await Dispute.findOne({ order_id: order._id });
Expand Down Expand Up @@ -367,10 +369,11 @@ const initialize = (botToken: string, options: Partial<Telegraf.Options<MainCont

order.status = 'CANCELED_BY_ADMIN';
order.canceled_by = ctx.admin._id;
const buyer = await User.findOne({ _id: order.buyer_id });
const seller = await User.findOne({ _id: order.seller_id });
await order.save();
OrderEvents.orderUpdated(order);
const buyer = await User.findOne({ _id: order.buyer_id });
const seller = await User.findOne({ _id: order.seller_id });
if (buyer === null || seller === null) throw Error("buyer and/or seller were not found in DB");
// we sent a private message to the admin
await messages.successCancelOrderMessage(ctx, ctx.admin, order, ctx.i18n);
// we sent a private message to the seller
Expand All @@ -390,11 +393,11 @@ const initialize = (botToken: string, options: Partial<Telegraf.Options<MainCont
throw new Error(ctxUpdateAssertMsg);
}
const params = ctx.update.message.text.split(' ');
const [command, orderId] = params.filter((el) => el);
const [command, orderId] = params.filter((el: string) => el);

if (!orderId) {
const orders = await askForConfirmation(ctx.user, command);
if (!orders.length) return await ctx.reply(`${command} <order Id>`);
if (orders === null || orders.length === 0) return await ctx.reply(`${command} <order Id>`);

return await messages.showConfirmationButtons(ctx, orders, command);
} else if (!(await validateObjectId(ctx, orderId))) {
Expand Down Expand Up @@ -445,7 +448,7 @@ const initialize = (botToken: string, options: Partial<Telegraf.Options<MainCont
await order.save();
OrderEvents.orderUpdated(order);
// We delete the messages related to that order from the channel
await deleteOrderFromChannel(order, bot.telegram);
await deleteOrderFromChannel(order, bot.telegram as any);
}
// we sent a private message to the user
await messages.successCancelAllOrdersMessage(ctx);
Expand All @@ -462,7 +465,7 @@ const initialize = (botToken: string, options: Partial<Telegraf.Options<MainCont
if (!(await validateObjectId(ctx, orderId))) return;

const order = await Order.findOne({ _id: orderId });
if (!order) return;
if (order === null) return;

// Check if the order status is already PAID_HOLD_INVOICE
if (order.status === 'PAID_HOLD_INVOICE') {
Expand Down Expand Up @@ -498,10 +501,11 @@ const initialize = (botToken: string, options: Partial<Telegraf.Options<MainCont
}

order.status = 'COMPLETED_BY_ADMIN';
const buyer = await User.findOne({ _id: order.buyer_id });
const seller = await User.findOne({ _id: order.seller_id });
await order.save();
OrderEvents.orderUpdated(order);
const buyer = await User.findOne({ _id: order.buyer_id });
const seller = await User.findOne({ _id: order.seller_id });
if (buyer === null || seller === null) throw Error("buyer and/or seller were not found in DB");
// we sent a private message to the admin
await messages.successCompleteOrderMessage(ctx, order);
// we sent a private message to the seller
Expand All @@ -525,11 +529,11 @@ const initialize = (botToken: string, options: Partial<Telegraf.Options<MainCont
if (!(await validateObjectId(ctx, orderId))) return;
const order = await Order.findOne({ _id: orderId });

if (!order) return;
if (order === null) return;

const buyer = await User.findOne({ _id: order.buyer_id });
const seller = await User.findOne({ _id: order.seller_id });

if (buyer === null || seller === null) throw Error("buyer and/or seller were not found in DB");
await messages.checkOrderMessage(ctx, order, buyer, seller);
} catch (error) {
logger.error(error);
Expand All @@ -543,7 +547,7 @@ const initialize = (botToken: string, options: Partial<Telegraf.Options<MainCont
if (!(await validateObjectId(ctx, orderId))) return;
const order = await Order.findOne({ _id: orderId });

if (!order) return;
if (order === null) return;
if (!order.hash) return;

const invoice = await getInvoice({ hash: order.hash });
Expand All @@ -567,7 +571,7 @@ const initialize = (botToken: string, options: Partial<Telegraf.Options<MainCont

const order = await Order.findOne({ hash });

if (!order) return;
if (order === null) return;
await subscribeInvoice(bot, hash, true);
ctx.reply(`hash resubscribed`);
} catch (error: any) {
Expand Down Expand Up @@ -606,11 +610,11 @@ const initialize = (botToken: string, options: Partial<Telegraf.Options<MainCont
throw new Error(ctxUpdateAssertMsg);
}
const params = ctx.update.message.text.split(' ');
const [command, orderId] = params.filter((el) => el);
const [command, orderId] = params.filter((el: string) => el);

if (!orderId) {
const orders = await askForConfirmation(ctx.user, command);
if (!orders.length) return await ctx.reply(`${command} <order Id>`);
if (orders === null || orders.length === 0) return await ctx.reply(`${command} <order Id>`);

return await messages.showConfirmationButtons(ctx, orders, command);
} else if (!(await validateObjectId(ctx, orderId))) {
Expand All @@ -637,7 +641,7 @@ const initialize = (botToken: string, options: Partial<Telegraf.Options<MainCont
const user = await User.findOne({
$or: [{ username }, { tg_id: username }],
});
if (!user) {
if (user === null) {
await messages.notFoundUserMessage(ctx);
return;
}
Expand All @@ -648,6 +652,7 @@ const initialize = (botToken: string, options: Partial<Telegraf.Options<MainCont
const community = await Community.findById(
ctx.admin.default_community_id
);
if (community === null) throw Error("Community was not found in DB");
community.banned_users.push({
id: user._id,
username: user.username,
Expand Down Expand Up @@ -680,7 +685,7 @@ const initialize = (botToken: string, options: Partial<Telegraf.Options<MainCont
const user = await User.findOne({
$or: [{ username }, { tg_id: username }],
});
if (!user) {
if (user === null) {
await messages.notFoundUserMessage(ctx);
return;
}
Expand All @@ -691,8 +696,9 @@ const initialize = (botToken: string, options: Partial<Telegraf.Options<MainCont
const community = await Community.findById(
ctx.admin.default_community_id
);
community.banned_users = community.banned_users.filter(
(el: any) => el.id !== user.id
if (community === null) throw Error("Community was not found in DB");
community.banned_users = community.banned_users.toObject().filter(
(el: IUsernameId) => el.id !== user.id
);
await community.save();
} else {
Expand Down Expand Up @@ -739,7 +745,7 @@ const initialize = (botToken: string, options: Partial<Telegraf.Options<MainCont
try {
const command = '/setinvoice';
const orders = await askForConfirmation(ctx.user, command);
if (!orders.length) return await ctx.reply(ctx.i18n.t('setinvoice_no_response'));
if (orders === null || !orders.length) return await ctx.reply(ctx.i18n.t('setinvoice_no_response'));

return await messages.showConfirmationButtons(ctx, orders, command);
} catch (error) {
Expand Down Expand Up @@ -859,6 +865,7 @@ const initialize = (botToken: string, options: Partial<Telegraf.Options<MainCont
bot.command('info', userMiddleware, async (ctx: MainContext) => {
try {
const config = await Config.findOne({});
if (config === null) throw Error("Config was not found in DB");
await messages.showInfoMessage(ctx, ctx.user, config);
} catch (error) {
logger.error(error);
Expand Down
Loading

0 comments on commit a31ab63

Please sign in to comment.