From c80742633f51e79d18d7cea71514ef16c96bc60b Mon Sep 17 00:00:00 2001 From: Alicia Sykes Date: Thu, 29 Feb 2024 21:08:43 +0000 Subject: [PATCH] Write interfaces and fetch logic for fetching github stats, privacy policy info, and website metrics for each service --- web/src/utils/fetch-privacy-policy.ts | 61 +++++++++++ web/src/utils/fetch-repo-info.ts | 68 ++++++++++++ web/src/utils/fetch-website-info.ts | 146 ++++++++++++++++++++++++++ 3 files changed, 275 insertions(+) create mode 100644 web/src/utils/fetch-privacy-policy.ts create mode 100644 web/src/utils/fetch-repo-info.ts create mode 100644 web/src/utils/fetch-website-info.ts diff --git a/web/src/utils/fetch-privacy-policy.ts b/web/src/utils/fetch-privacy-policy.ts new file mode 100644 index 0000000..9b1cc29 --- /dev/null +++ b/web/src/utils/fetch-privacy-policy.ts @@ -0,0 +1,61 @@ + +export const fetchTosdrPrivacy = async (serviceId: string): Promise => { + const endpoint = `https://api.tosdr.org/service/v2?id=${serviceId}`; + try { + return await fetch(endpoint).then((res) => res.json()); + } catch (error) { + console.error('Error fetching privacy policy data:', error); + return null; + } +}; + +interface Document { + id: number; + name: string; + url: string; + updated_at: string; + created_at: string; +} + +interface Case { + id: number; + weight: number; + title: string; + description: string; + updated_at: string; + created_at: string; + topic_id: number; + classification: string; +} + +interface Point { + id: number; + title: string; + source: string; + status: string; + analysis: string; + case: Case; + document_id: number | null; + updated_at: string; + created_at: string; +} + +interface Params { + id: number; + is_comprehensively_reviewed: boolean; + name: string; + updated_at: string; + created_at: string; + slug: string; + rating: string; + urls: string[]; + image: string; + documents: Document[]; + points: Point[]; +} + +export interface PrivacyPolicyResponse { + error: number; + message: string; + parameters: Params; +} diff --git a/web/src/utils/fetch-repo-info.ts b/web/src/utils/fetch-repo-info.ts new file mode 100644 index 0000000..62a650c --- /dev/null +++ b/web/src/utils/fetch-repo-info.ts @@ -0,0 +1,68 @@ + + + +export const fetchGitHubStats = async (github: string): Promise => { + const endpoint = `https://repo-info.as93.workers.dev/${github}`; + try { + return await fetch(endpoint).then((res) => res.json()); + } catch (error) { + console.error('Error fetching GitHub stats:', error); + return null; + } +}; + +// fetch(`https://repo-info.as93.workers.dev/${github}`).then((res) => res.json()); + +export interface GitHubStatsResponse { + info: { + ownerUsername: string; + ownerAvatar: string; + description: string; + url: string; + homepage: string; + language: string; + topics: string[]; + license: string; + isFork: boolean; + isArchived: boolean; + createdAt: string; + updatedAt: string; + size: number; + scarCount: number; + forksCount: number; + watchersCount: number; + }; + languages: { + [key: string]: number; + }; + updates: Array<{ + type: string; + actor: { + username: string; + avatar: string; + }; + repo: string; + action: string; + createdAt: string; + number?: number; + }>; + versions: Array<{ + name: string; + commit: string; + zipball: string; + tarball: string; + }>; + contributors: Array<{ + username: string; + avatar: string; + contributions: number; + }>; + commits: Array<{ + sha: string; + authorName: string; + authorDate: string; + message: string; + authorUsername: string; + authorAvatar: string; + }>; +} diff --git a/web/src/utils/fetch-website-info.ts b/web/src/utils/fetch-website-info.ts new file mode 100644 index 0000000..0f236ba --- /dev/null +++ b/web/src/utils/fetch-website-info.ts @@ -0,0 +1,146 @@ + +export const fetchWebsiteInfo = async (url: string): Promise => { + const endpoint = `https://site-info-fetch.as93.workers.dev/?url=${url}`; + try { + return await fetch(endpoint).then((res) => res.json()); + } catch (error) { + console.error('Error fetching website info:', error); + return null; + } +}; + +interface DNSRecord { + target: string; + ip: string; + country_code: string; + country_name: string; + isp: string; +} + +interface DNSRecords { + ns: { + records: DNSRecord[]; + }; + mx: { + records: DNSRecord[]; + }; +} + +interface Engine { + name: string; + reference: string; + detected: boolean; +} + +interface DomainBlacklist { + engines: Engine[]; + detections: number; +} + +interface FileType { + signature: string; + extension: string; + headers: string; +} + +interface GeoLocation { + countries: string[]; +} + +interface HtmlForms { + number_of_total_forms: number; + number_of_total_input_fields: number; + two_text_inputs_in_a_form: boolean; + credit_card_field_present: boolean; + password_field_present: boolean; + email_field_present: boolean; +} + +interface Redirection { + found: boolean; + external: boolean; + url: string; + redirects: any[]; +} + +interface ResponseHeaders { + code: number; + status: string; + date: string; + last_modified: string; + etag: string; + accept_ranges: string; + vary: string; + content_encoding: string; + cache_control: string; + content_length: string; + content_type: string; + age: string; + content_security_policy_report_only: string; + strict_transport_security: string; + public_key_pins_report_only: string; + x_frame_options: string; + x_content_type_options: string; + x_xss_protection: string; + referrer_policy: string; + x_permitted_cross_domain_policies: string; + onion_location: string; +} + +interface RiskScore { + result: number; +} + +interface SecurityChecks { + [key: string]: boolean | string; +} + +interface ServerDetails { + ip: string; + hostname: string; + continent_code: string; + continent_name: string; + country_code: string; + country_name: string; + region_name: string; + city_name: string; + latitude: number; + longitude: number; + isp: string; + asn: string; +} + +interface SiteCategory { + [key: string]: boolean; +} + +interface UrlParts { + scheme: string; + host: string; + host_nowww: string; + port: null | number; + path: null | string; + query: null | string; +} + +interface WebPage { + title: string; + description: string; + keywords: string; +} + +export interface WebsiteData { + dns_records: DNSRecords; + domain_blacklist: DomainBlacklist; + file_type: FileType; + geo_location: GeoLocation; + html_forms: HtmlForms; + redirection: Redirection; + response_headers: ResponseHeaders; + risk_score: RiskScore; + security_checks: SecurityChecks; + server_details: ServerDetails; + site_category: SiteCategory; + url_parts: UrlParts; + web_page: WebPage; +}