Skip to content

Commit

Permalink
static version of visitedLog
Browse files Browse the repository at this point in the history
  • Loading branch information
qihexiang committed Apr 14, 2022
1 parent 9cad772 commit 66e9e96
Show file tree
Hide file tree
Showing 2 changed files with 82 additions and 65 deletions.
125 changes: 60 additions & 65 deletions src/dm/hotList.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,27 +3,18 @@ const ajv = new Ajv({
int32range: false
});

type Visited = {
path: string, count: number
}[]
type Visited = Record<string, number>

const schema: JTDSchemaType<Visited> = {
elements: {
properties: {
path: { type: "string" },
count: { type: "uint32" }
}
}
values: {type: "uint32"}
}

const validator = ajv.compile(schema)

let visitedLog: Visited = [];
let visitedLog: Visited = {};

export function loadHotList() {
return fetch(`/api/visited/`, {
mode: "cors"
})
return fetch("/posts/log.json")
.then(res => res.json())
.then(json => {
if (validator(json)) return json;
Expand All @@ -40,65 +31,69 @@ export function loadHotList() {
})
}

type NanoID = {
id: string, sign: string
}
// type NanoID = {
// id: string, sign: string
// }

const nanoIdSchema: JTDSchemaType<NanoID> = {
properties: {
id: { type: "string" },
sign: { type: "string" }
}
}
// const nanoIdSchema: JTDSchemaType<NanoID> = {
// properties: {
// id: { type: "string" },
// sign: { type: "string" }
// }
// }

const nanoIdValidator = ajv.compile(nanoIdSchema)
// const nanoIdValidator = ajv.compile(nanoIdSchema)

export function getNanoID() {
return fetch(`/api/visited/nanoid`, {
mode: "cors"
})
.then(res => res.json())
.then(json => {
if (nanoIdValidator(json)) return json;
throw new Error("Invalid data");
})
.then(nanoId => {
localStorage.setItem("id", nanoId.id)
localStorage.setItem("sign", nanoId.sign)
return nanoId
})
.catch(err => {
console.log("Failed to get an nanoid, retry later");
console.log(JSON.stringify(err))
return null
})
}
// export function getNanoID() {
// return fetch(`/api/visited/nanoid`, {
// mode: "cors"
// })
// .then(res => res.json())
// .then(json => {
// if (nanoIdValidator(json)) return json;
// throw new Error("Invalid data");
// })
// .then(nanoId => {
// localStorage.setItem("id", nanoId.id)
// localStorage.setItem("sign", nanoId.sign)
// return nanoId
// })
// .catch(err => {
// console.log("Failed to get an nanoid, retry later");
// console.log(JSON.stringify(err))
// return null
// })
// }

async function loadNanoId() {
const id = localStorage.getItem("id");
const sign = localStorage.getItem("sign");
const nanoId: NanoID = id === null || sign === null ? await getNanoID() ?? { id: "", sign: "" } : { id, sign }
return nanoId
}
// async function loadNanoId() {
// const id = localStorage.getItem("id");
// const sign = localStorage.getItem("sign");
// const nanoId: NanoID = id === null || sign === null ? await getNanoID() ?? { id: "", sign: "" } : { id, sign }
// return nanoId
// }

export async function logVisit(url: string) {
const nanoId = await loadNanoId();
return fetch(`/api/visited/${url}?id=${nanoId.id}&sign=${nanoId.sign}`, {
mode: "cors", method: "PUT"
})
.then(res => {
if (res.status === 403) getNanoID();
return res.ok;
})
.catch((err) => {
console.log(JSON.stringify(err))
return false
})
}
// export async function logVisit(url: string) {
// const nanoId = await loadNanoId();
// return fetch(`/api/visited/${url}?id=${nanoId.id}&sign=${nanoId.sign}`, {
// mode: "cors", method: "PUT"
// })
// .then(res => {
// if (res.status === 403) getNanoID();
// return res.ok;
// })
// .catch((err) => {
// console.log(JSON.stringify(err))
// return false
// })
// }

export function getVisitedCount(url: string) {
return visitedLog.find(log => log.path === url)?.count ?? 0
if(encodeURI(url) in visitedLog) {
return visitedLog[url]
} else {
return 0
}
}

loadHotList();
loadNanoId();
// loadNanoId();
22 changes: 22 additions & 0 deletions tools/generateLog.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import { argv, cwd } from "process";
import { readFileSync, writeFileSync } from "fs";
import { join } from "path";

const [logFile] = argv.slice(2)
const file = readFileSync(join(cwd(), logFile), { encoding: "utf-8" })
const targets = file.split("\n")
.map(log => log.split(" ")[11]).filter(value => typeof value === "string")
.map(value => value.replace(/\"/g, ""))
.filter(value => value.match(/(index.md)$/))
.map(target => target.replace(/(index.md)$/, ""))
.map(target => target.replace(/^\//, ""))
const visitedCounts: { [path: string]: number } = targets.reduce(
(logs, next) => {
if (next in logs) {
return { ...logs, next: logs[next] + 1 }
} else {
return { ...logs, next: 1 }
}
}, {}
)
writeFileSync(join(__dirname, "..", "public", "posts", "logs.json"), JSON.stringify(visitedCounts))

0 comments on commit 66e9e96

Please sign in to comment.