fix publication details

This commit is contained in:
peter.maquiran
2025-09-11 11:20:44 +01:00
parent 69e4334ebf
commit 5f7295d41c
74 changed files with 1639 additions and 678 deletions
+217 -35
View File
@@ -103,49 +103,231 @@ import { registerLocaleData } from '@angular/common';
import localePt from '@angular/common/locales/pt';
import { LogsDatabase } from './infra/database/dexie/instance/logs/service';
import { UserModule } from './module/user/user.module';
import { Logger } from './services/logger/main/service';
// Register the locale data
registerLocaleData(localePt, 'pt');
Sentry.init(
{
dsn: 'https://5b345a3ae70b4e4da463da65881b4aaa@o4504340905525248.ingest.sentry.io/4504345615794176',
// To set your release and dist versions
release: 'gabinetedigital@1.0.0',
dist: '1',
// Set tracesSampleRate to 1.0 to capture 100% of transactions for performance monitoring.
// We recommend adjusting this value in production.
tracesSampleRate: 1.0,
integrations: [
new BrowserTracing({
tracingOrigins: ['localhost', 'https://gd-api.oapr.gov.ao/api/'],
}) as Integration,
],
beforeSend(event) {
console.log('event.exception.values[0].value', event.exception.values[0].value);
// Sentry.init(
// {
// dsn: 'https://5b345a3ae70b4e4da463da65881b4aaa@o4504340905525248.ingest.sentry.io/4504345615794176',
// // To set your release and dist versions
// release: 'gabinetedigital@1.0.0',
// dist: '1',
// // Set tracesSampleRate to 1.0 to capture 100% of transactions for performance monitoring.
// // We recommend adjusting this value in production.
// tracesSampleRate: 1.0,
// integrations: [
// new BrowserTracing({
// tracingOrigins: ['localhost', 'https://gd-api.oapr.gov.ao/api/'],
// }) as Integration,
// ],
// beforeSend(event) {
// console.log('event.exception.values[0].value', event.exception.values[0].value);
if (event.level === 'error') {
// if (event.level === 'error') {
LogsDatabase.sentryError.add(event as any).then(() => {
console.log('event', event)
})
// LogsDatabase.sentryError.add(event as any).then(() => {
// console.log('event', event)
// })
openTelemetryLogging.send({
level: 'info',
message: event.exception.values[0].value,
payload: {
object: {
sentry: true,
error: event
}
},
})
// openTelemetryLogging.send({
// level: 'info',
// message: event.exception.values[0].value,
// payload: {
// object: {
// sentry: true,
// error: event
// }
// },
// })
// }
// console.log('Sentry Event', event);
// // Return event to send it to Sentry
// return event;
// },
// }
// );
import Tracker from '@openreplay/tracker';
import trackerAssist from '@openreplay/tracker-assist'; // 👈 for errors, logs & stack traces
const tracker = new Tracker({
projectKey: "g8HOZiBi5iUWEsK3Ajw5",
__DISABLE_SECURE_MODE: true, // ✅ allow HTTP + localhost
});
tracker.start()
tracker.use(trackerAssist());
tracker.setUserID('john@doe.com');
(function () {
const httpLogs = [];
// --- Patch fetch ---
const originalFetch = window.fetch;
window.fetch = async (input, config = {}) => {
const url = typeof input === "string" ? input : (input as any).url;
const method = config?.method || "GET";
// Capture tracer header
let tracerHeader = null;
if (config?.headers) {
if (config.headers instanceof Headers) {
tracerHeader = config.headers.get("x-tracer");
} else if (typeof config.headers === "object") {
tracerHeader = config.headers["x-tracer"] || config.headers["X-Tracer"];
}
}
// Return event to send it to Sentry
return event;
},
}
);
// Capture request body (payload)
let requestPayload = null;
if (config?.body) {
try {
requestPayload = typeof config.body === "string"
? config.body
: JSON.stringify(config.body);
} catch {
requestPayload = "[Unserializable body]";
}
}
const start = Date.now();
try {
const response = await originalFetch(input, config);
// Clone response so we dont consume it
const clone = response.clone();
let responsePayload = null;
try {
const contentType = clone.headers.get("content-type") || "";
if (contentType.includes("application/json")) {
responsePayload = await clone.json();
} else if (contentType.includes("text")) {
responsePayload = await clone.text();
} else {
responsePayload = "[Non-textual body]";
}
} catch {
responsePayload = "[Unserializable response]";
}
const log = {
type: "fetch",
url,
method,
status: response.status,
xTracer: tracerHeader,
requestPayload,
responsePayload,
duration: Date.now() - start,
timestamp: new Date().toISOString(),
};
if(response.status >= 400 || response.status === 0) {
Logger.error('XHR', log)
}
httpLogs.push(log);
return response;
} catch (error) {
const log = {
type: "fetch",
url,
method,
status: "NETWORK_ERROR",
xTracer: tracerHeader,
requestPayload,
responsePayload: null,
duration: Date.now() - start,
timestamp: new Date().toISOString(),
};
if(!url.includes('petermaquiran.xyz') && url != "") {
Logger.error('XHR', log);
}
httpLogs.push(log);
throw error;
}
};
// --- Patch XMLHttpRequest ---
const OriginalXHR = window.XMLHttpRequest;
function CustomXHR() {
const xhr: any = new OriginalXHR();
const start = Date.now();
xhr._xTracer = null;
xhr._requestPayload = null;
const originalSetRequestHeader = xhr.setRequestHeader;
xhr.setRequestHeader = function (key, value) {
if (key.toLowerCase() === "x-tracer") {
xhr._xTracer = value;
}
return originalSetRequestHeader.call(xhr, key, value);
};
const originalSend = xhr.send;
xhr.send = function (body) {
if (body) {
try {
xhr._requestPayload = typeof body === "string" ? body : JSON.stringify(body);
} catch {
xhr._requestPayload = "[Unserializable body]";
}
}
return originalSend.call(xhr, body);
};
xhr.addEventListener("loadend", function () {
let responsePayload = null;
try {
const contentType = xhr.getResponseHeader("content-type") || "";
if (contentType.includes("application/json")) {
responsePayload = JSON.parse(xhr.responseText);
} else if (contentType.includes("text")) {
responsePayload = xhr.responseText;
} else {
responsePayload = "[Non-textual body]";
}
} catch {
responsePayload = "[Unserializable response]";
}
const log = {
type: "xhr",
url: xhr.responseURL,
method: xhr._method || "GET",
status: xhr.status,
xTracer: xhr._xTracer,
requestPayload: xhr._requestPayload,
responsePayload,
duration: Date.now() - start,
timestamp: new Date().toISOString(),
};
if(xhr.status >= 400 || xhr.status === 0) {
Logger.error('XHR', log)
}
httpLogs.push(log);
});
const originalOpen = xhr.open;
xhr.open = function (method, url, ...rest) {
xhr._method = method;
return originalOpen.call(xhr, method, url, ...rest);
};
return xhr;
}
(window as any).XMLHttpRequest = CustomXHR;
// Expose logs
(window as any).getHttpLogs = () => httpLogs;
})();
@NgModule({
declarations: [AppComponent, PopupQuestionPipe, InputFilterDirective],