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.
 | // Import the storage management module.
 | ||||||
| const secretariat = await import(chrome.runtime.getURL("scripts/secretariat.js")); | 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.
 | // 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. | 	/* Initialize a new product with its details. | ||||||
| 
 | 
 | ||||||
| 	@param {object} details the product details | 	@param {object} details the product details | ||||||
|  | 	@param {object} URL the URL | ||||||
|  | 	@param {object} options the options | ||||||
| 	*/ | 	*/ | ||||||
| 	constructor (details) { | 	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; | ||||||
| 	}; | 	}; | ||||||
| 
 | 
 | ||||||
| 	/* Get the product information. | 	/* Attach the product data to the storage. */ | ||||||
| 
 | 	async attach() { | ||||||
| 	@param {object} options the options | 		// First get the hash of this data. 
 | ||||||
| 	@returns {object} the analysis | 		const digest = async (DATA, OPTIONS) => { | ||||||
| 	*/ | 			DATA = {"raw": DATA}; | ||||||
| 	analyze(options) { | 			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`]))); | ||||||
| 		const gemini = (await import('./AI/gemini.js')).default; | 			return (DATA[`hashed`]);	 | ||||||
| 		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`); | 		}; | ||||||
| 
 |  | ||||||
| 
 | 
 | ||||||
|  | 		 | ||||||
|  | 		// 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