185 lines
5.2 KiB
Bash
185 lines
5.2 KiB
Bash
#!/usr/bin/env bash
|
|
|
|
cat <<EOF
|
|
.__ .__ __
|
|
____ ____ ______ _ _______ | | | | _____/ |_
|
|
/ ___\_/ __ \ / \ \/ \/ /\__ \ | | | | _/ __ \ __\\
|
|
/ /_/ > ___/| | \ / / __ \| |_| |_\ ___/| |
|
|
\___ / \___ >___| /\/\_/ (____ /____/____/\___ >__|
|
|
/_____/ \/ \/ \/ \/
|
|
|
|
EOF
|
|
|
|
error () {
|
|
echo -n "error: $1"
|
|
exit 1
|
|
}
|
|
|
|
wallet=$1
|
|
[ -z $wallet ] && read -p "Enter wallet name: " wallet
|
|
[ -z $wallet ] && error "name required"
|
|
|
|
# default is wallet in UPPERCASE
|
|
walletType="${wallet^^}"
|
|
read -p "Enter walletType (default $walletType): " _walletType
|
|
if [ ! -z $_walletType ]; then
|
|
walletType=$_walletType
|
|
fi
|
|
|
|
# default is wallet capitalized with "wallet" prefix
|
|
walletField="wallet${wallet^}"
|
|
read -p "Enter walletField (default $walletField): " _walletField
|
|
if [ ! -z $_walletField ]; then
|
|
walletField=$_walletField
|
|
fi
|
|
|
|
# exit on first failed command
|
|
set -e
|
|
|
|
todo() {
|
|
echo "// $wallet::TODO"
|
|
}
|
|
|
|
# create folder and index.js
|
|
mkdir -p wallets/$wallet
|
|
cat > wallets/$wallet/index.js <<EOF
|
|
$(todo)
|
|
// create validation schema for wallet and import here
|
|
// import { ${wallet}Schema } from '@/lib/validate'
|
|
|
|
export const name = '$wallet'
|
|
|
|
$(todo)
|
|
// configure wallet fields
|
|
export const fields = []
|
|
|
|
$(todo)
|
|
// configure wallet card
|
|
export const card = {
|
|
title: '$wallet',
|
|
subtitle: '',
|
|
badges: []
|
|
}
|
|
|
|
$(todo)
|
|
// set validation schema
|
|
export const fieldValidation = null // ${wallet}Schema
|
|
|
|
export const walletType = '$walletType'
|
|
|
|
export const walletField = '$walletField'
|
|
|
|
EOF
|
|
|
|
# create client.js
|
|
cat > wallets/$wallet/client.js <<EOF
|
|
export * from 'wallets/$wallet'
|
|
|
|
export async function testSendPayment (config, { logger }) {
|
|
$(todo)
|
|
}
|
|
|
|
export async function sendPayment (bolt11, config) {
|
|
$(todo)
|
|
}
|
|
|
|
EOF
|
|
|
|
# create server.js
|
|
cat > wallets/$wallet/server.js <<EOF
|
|
export * from 'wallets/$wallet'
|
|
|
|
export async function testCreateInvoice (config) {
|
|
$(todo)
|
|
}
|
|
|
|
export async function createInvoice (
|
|
{ msats, description, descriptionHash, expiry },
|
|
config
|
|
) {
|
|
$(todo)
|
|
}
|
|
|
|
EOF
|
|
|
|
# add TODOs where manual update is needed
|
|
fragments=fragments/wallet.js
|
|
i=0
|
|
grep -n "// XXX \[WALLET\]" $fragments | while read -r match;
|
|
do
|
|
lineno=$(echo $match | cut -d':' -f1)
|
|
sed -i "$((lineno+i))i $(todo)" $fragments
|
|
i=$((i+1))
|
|
done
|
|
|
|
client=wallets/client.js
|
|
lineno=$(grep -n "export default" $client | cut -d':' -f1)
|
|
sed -i "${lineno}i $(todo)" $client
|
|
|
|
server=wallets/server.js
|
|
lineno=$(grep -n "export default" $server | cut -d':' -f1)
|
|
sed -i "${lineno}i $(todo)" $server
|
|
|
|
# need to disable exit on failure since we run grep to check its exit code
|
|
set +e
|
|
|
|
# check if prisma/schema.prisma needs patch
|
|
schema=prisma/schema.prisma
|
|
grep --quiet "$walletField" $schema
|
|
if [ $? -eq 1 ]; then
|
|
tablename=${walletField^}
|
|
# find line to insert walletField in wallet model
|
|
lineno=$(grep -n "model Wallet {" $schema | cut -d':' -f1)
|
|
offset=$(tail -n +$lineno $schema | grep -nm 1 "}" | cut -d':' -f1)
|
|
offset=$(tail -n +$lineno $schema | head -n $offset | grep -nE "wallet[[:alpha:]]+\s+ Wallet[[:alpha:]]" | cut -d':' -f1 | tail -n1)
|
|
sed -i "$((lineno+offset))i\ \ $walletField $tablename?" $schema
|
|
|
|
# find line to insert model for wallet
|
|
lineno=$(grep -nE "model Wallet[[:alpha:]]+ {" $schema | cut -d':' -f1 | tail -n1)
|
|
offset=$(tail -n +$((lineno+1)) $schema | grep -nm 1 "{" | cut -d':' -f1)
|
|
i=$((lineno+offset))
|
|
sed -i "${i}i $(todo)" $schema
|
|
sed -i "$((i+1))i model Wallet${wallet^} {\n" $schema
|
|
sed -i "$((i+2))i\ \ id Int @id @default(autoincrement())" $schema
|
|
sed -i "$((i+3))i\ \ walletId Int @unique" $schema
|
|
sed -i "$((i+4))i\ \ wallet Wallet @relation(fields: [walletId], references: [id], onDelete: Cascade)" $schema
|
|
sed -i "$((i+5))i\ \ createdAt DateTime @default(now()) @map(\"created_at\")" $schema
|
|
sed -i "$((i+6))i\ \ updatedAt DateTime @default(now()) @updatedAt @map(\"updated_at\")" $schema
|
|
sed -i "$((i+7))i }" $schema
|
|
|
|
# find line to insert wallet type
|
|
lineno=$(grep -nE "enum WalletType {" $schema | cut -d':' -f1)
|
|
offset=$(tail -n +$lineno $schema | grep -nm 1 "}" | cut -d':' -f1)
|
|
i=$((lineno+offset-1))
|
|
sed -i "${i} i\ \ ${walletType}" $schema
|
|
|
|
# create migration file with TODOs
|
|
migrationDir="prisma/migrations/$(date +%Y%m%d%H%M%S_$wallet)"
|
|
mkdir -p $migrationDir
|
|
cat > $migrationDir/migration.sql <<EOF
|
|
-- AlterEnum
|
|
ALTER TYPE "WalletType" ADD VALUE '${walletType}';
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "$tablename" (
|
|
"id" SERIAL NOT NULL,
|
|
"walletId" INTEGER NOT NULL,
|
|
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updated_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
-- $wallet::TODO
|
|
|
|
CONSTRAINT "${tablename}_pkey" PRIMARY KEY ("int")
|
|
);
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "${tablename}_walletId_key" ON "$tablename"("walletId");
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "$tablename" ADD CONSTRAINT "${tablename}_walletId_fkey" FOREIGN KEY ("walletId") REFERENCES "Wallet"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
CREATE TRIGGER wallet_${wallet}_as_jsonb
|
|
AFTER INSERT OR UPDATE ON "$tablename"
|
|
FOR EACH ROW EXECUTE PROCEDURE wallet_wallet_type_as_jsonb();
|
|
EOF
|
|
fi
|