remove - Michael
This commit is contained in:
@@ -118,7 +118,10 @@ function base32Encode(data: Buffer): string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function base32Decode(input: string): Buffer | null {
|
function base32Decode(input: string): Buffer | null {
|
||||||
const cleaned = input.trim().replace(/^NOOK-/i, "").replace(/[^A-Z2-7]/g, "");
|
const cleaned = input
|
||||||
|
.trim()
|
||||||
|
.replace(/^NOOK-/i, "")
|
||||||
|
.replace(/[^A-Z2-7]/g, "");
|
||||||
if (cleaned.length === 0) return null;
|
if (cleaned.length === 0) return null;
|
||||||
let bits = 0;
|
let bits = 0;
|
||||||
let value = 0;
|
let value = 0;
|
||||||
@@ -139,7 +142,8 @@ function base32Decode(input: string): Buffer | null {
|
|||||||
function encodeKey(data: Buffer): string {
|
function encodeKey(data: Buffer): string {
|
||||||
const encoded = base32Encode(data);
|
const encoded = base32Encode(data);
|
||||||
const groups: string[] = [];
|
const groups: string[] = [];
|
||||||
for (let i = 0; i < encoded.length; i += 5) groups.push(encoded.slice(i, i + 5));
|
for (let i = 0; i < encoded.length; i += 5)
|
||||||
|
groups.push(encoded.slice(i, i + 5));
|
||||||
return `${KEY_PREFIX}${groups.join("-")}`;
|
return `${KEY_PREFIX}${groups.join("-")}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -171,7 +175,14 @@ async function insertLicense(
|
|||||||
await NookConnectionFactory().execute({
|
await NookConnectionFactory().execute({
|
||||||
sql: `INSERT INTO licenses (id, key, email, stripe_session_id, created_at, revoked, max_devices)
|
sql: `INSERT INTO licenses (id, key, email, stripe_session_id, created_at, revoked, max_devices)
|
||||||
VALUES (?, ?, ?, ?, ?, 0, ?)`,
|
VALUES (?, ?, ?, ?, ?, 0, ?)`,
|
||||||
args: [id, key, email, stripeSessionId, new Date().toISOString(), maxDevices]
|
args: [
|
||||||
|
id,
|
||||||
|
key,
|
||||||
|
email,
|
||||||
|
stripeSessionId,
|
||||||
|
new Date().toISOString(),
|
||||||
|
maxDevices
|
||||||
|
]
|
||||||
});
|
});
|
||||||
return { key, id };
|
return { key, id };
|
||||||
}
|
}
|
||||||
@@ -207,7 +218,10 @@ export async function grantLicense(
|
|||||||
* Sends a license key to the buyer. Best-effort — failures are logged, never
|
* Sends a license key to the buyer. Best-effort — failures are logged, never
|
||||||
* thrown, so the caller (checkout webhook / resend) isn't interrupted.
|
* thrown, so the caller (checkout webhook / resend) isn't interrupted.
|
||||||
*/
|
*/
|
||||||
export async function emailLicenseKey(to: string, licenseKey: string): Promise<void> {
|
export async function emailLicenseKey(
|
||||||
|
to: string,
|
||||||
|
licenseKey: string
|
||||||
|
): Promise<void> {
|
||||||
try {
|
try {
|
||||||
await fetch("https://api.brevo.com/v3/smtp/email", {
|
await fetch("https://api.brevo.com/v3/smtp/email", {
|
||||||
method: "POST",
|
method: "POST",
|
||||||
@@ -223,7 +237,7 @@ export async function emailLicenseKey(to: string, licenseKey: string): Promise<v
|
|||||||
textContent:
|
textContent:
|
||||||
`Your The Nook license key is:\n\n${licenseKey}\n\n` +
|
`Your The Nook license key is:\n\n${licenseKey}\n\n` +
|
||||||
`Open The Nook, go to Settings, and enter this key to activate.\n` +
|
`Open The Nook, go to Settings, and enter this key to activate.\n` +
|
||||||
`You can activate up to 3 devices.\n\n— Michael`
|
`You can activate up to 3 devices.`
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
|||||||
Reference in New Issue
Block a user