add product saving feature
Require attachment prior to saving
This commit is contained in:
parent
c2f5daac98
commit
563d6243e5
1 changed files with 72 additions and 11 deletions
|
@ -3,25 +3,86 @@ Ask product information to Google Gemini. */
|
|||
|
||||
// Import the storage management module.
|
||||
const secretariat = await import(chrome.runtime.getURL("scripts/secretariat.js"));
|
||||
const texts = (await import(chrome.runtime.getURL("scripts/read.js"))).default;
|
||||
|
||||
// Don't forget to set the class as export default.
|
||||
class product {
|
||||
export default class product {
|
||||
// Create private variables for explicit use for the storage.
|
||||
#snip;
|
||||
#options;
|
||||
|
||||
/* Initialize a new product with its details.
|
||||
|
||||
@param {object} details the product details
|
||||
*/
|
||||
constructor (details) {
|
||||
};
|
||||
|
||||
/* Get the product information.
|
||||
|
||||
@param {object} URL the URL
|
||||
@param {object} options the options
|
||||
@returns {object} the analysis
|
||||
*/
|
||||
analyze(options) {
|
||||
const gemini = (await import('./AI/gemini.js')).default;
|
||||
let analyzer = new gemini ((typeof(options).includes(`obj`) && !Array.isArray(options) && options != null) ? options[`API Key`] : await secretariat.read([`settings`,`analysis`,`api`,`key`], 1), `gemini-pro`);
|
||||
|
||||
|
||||
constructor (details, URL = window.location.href, options) {
|
||||
if (!(typeof(options).includes(`obj`) && !Array.isArray(options) && options != null)) {
|
||||
options = {};
|
||||
}
|
||||
|
||||
/* Remove uneeded data or formatting from the URL and the data. */
|
||||
let clean = (URL) => {
|
||||
// Remove the protocol from the URL.
|
||||
return(URL.replace(/(^\w+:|^)\/\//, ``).split(`?`));
|
||||
}
|
||||
|
||||
// Compare a digested data to its intended storage location.
|
||||
function compare(URL, DATA) {
|
||||
let RESULT = secretariat.read([`sites`, URL]).then((DATA_STORED) => {
|
||||
if (DATA_STORED) {
|
||||
return (DATA_STORED == digest(DATA, options));
|
||||
};
|
||||
});
|
||||
|
||||
return(RESULT);
|
||||
};
|
||||
|
||||
|
||||
|
||||
// Set this product's details as part of the object's properties.
|
||||
this.URL = clean(URL);
|
||||
this.details = details;
|
||||
|
||||
// Set private variables.
|
||||
this.#options = options;
|
||||
};
|
||||
|
||||
/* Attach the product data to the storage. */
|
||||
async attach() {
|
||||
// First get the hash of this data.
|
||||
const digest = async (DATA, OPTIONS) => {
|
||||
DATA = {"raw": DATA};
|
||||
DATA[`hashed`] = await(crypto.subtle.digest(((OPTIONS != null && typeof(OPTIONS).includes(`obj`) && !Array.isArray(OPTIONS)) ? OPTIONS[`digestion`] : false) ? OPTIONS[`digestion`] : "SHA-512", (new TextEncoder()).encode(DATA[`raw`])));
|
||||
return (DATA[`hashed`]);
|
||||
};
|
||||
|
||||
|
||||
// Compare.
|
||||
const compare = async(URL, digest) => {
|
||||
let RESULT = await secretariat.read([`sites`, URL, `data`]);
|
||||
|
||||
return ((RESULT) ? (RESULT == digest) : false);
|
||||
};
|
||||
|
||||
|
||||
// Add the data digest.
|
||||
this.#snip = digest(this.details, this.#options);
|
||||
|
||||
// Add the status about this data.
|
||||
this.status = {};
|
||||
this.status[`update`] = !compare(this.URL, this.#snip);
|
||||
}
|
||||
|
||||
async save() {
|
||||
// Stop when not attached (basically, not entirely initialized).
|
||||
if (!this.#snip) {throw new ReferenceError(texts.localized(`error_msg_notattached`))};
|
||||
|
||||
// Save the data to the storage.
|
||||
secretariat.write([`sites`, this.URL, `data`], this.#snip);
|
||||
|
||||
// Write the analysis data to the storage.
|
||||
(this[`analysis`]) ? secretariat.write([`sites`, this.URL, `analysis`], this.analysis): false;
|
||||
};
|
||||
};
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue