Write interfaces and fetch logic for fetching github stats, privacy policy info, and website metrics for each service

This commit is contained in:
Alicia Sykes 2024-02-29 21:08:43 +00:00
parent 6bf594654d
commit c80742633f
3 changed files with 275 additions and 0 deletions

View File

@ -0,0 +1,61 @@
export const fetchTosdrPrivacy = async (serviceId: string): Promise<PrivacyPolicyResponse | null> => {
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;
}

View File

@ -0,0 +1,68 @@
export const fetchGitHubStats = async (github: string): Promise<GitHubStatsResponse | null> => {
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;
}>;
}

View File

@ -0,0 +1,146 @@
export const fetchWebsiteInfo = async (url: string): Promise<WebsiteData | null> => {
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;
}