fase(3): crawling module domain and application
This commit is contained in:
34
dist/modules/crawling/domain/entities/CrawlAction.js
vendored
Normal file
34
dist/modules/crawling/domain/entities/CrawlAction.js
vendored
Normal file
@@ -0,0 +1,34 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.CrawlAction = void 0;
|
||||
const Entity_1 = require("../../../../shared/domain/Entity");
|
||||
class CrawlAction extends Entity_1.Entity {
|
||||
constructor(props, id) {
|
||||
super(props, id);
|
||||
}
|
||||
static create(props, id) {
|
||||
return new CrawlAction(props, id);
|
||||
}
|
||||
get type() {
|
||||
return this.props.type;
|
||||
}
|
||||
get selector() {
|
||||
return this.props.selector;
|
||||
}
|
||||
get value() {
|
||||
return this.props.value;
|
||||
}
|
||||
get seed() {
|
||||
return this.props.seed;
|
||||
}
|
||||
get stateId() {
|
||||
return this.props.stateId;
|
||||
}
|
||||
get sessionId() {
|
||||
return this.props.sessionId;
|
||||
}
|
||||
get sequenceOrder() {
|
||||
return this.props.sequenceOrder;
|
||||
}
|
||||
}
|
||||
exports.CrawlAction = CrawlAction;
|
||||
80
dist/modules/crawling/domain/entities/CrawlSession.js
vendored
Normal file
80
dist/modules/crawling/domain/entities/CrawlSession.js
vendored
Normal file
@@ -0,0 +1,80 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.CrawlSession = void 0;
|
||||
const AggregateRoot_1 = require("../../../../shared/domain/AggregateRoot");
|
||||
const Result_1 = require("../../../../shared/domain/Result");
|
||||
const Url_1 = require("../value-objects/Url");
|
||||
const CrawlStarted_1 = require("../events/CrawlStarted");
|
||||
const CrawlCompleted_1 = require("../events/CrawlCompleted");
|
||||
const CrawlFailed_1 = require("../events/CrawlFailed");
|
||||
class CrawlSession extends AggregateRoot_1.AggregateRoot {
|
||||
constructor(props, id) {
|
||||
super(props, id);
|
||||
}
|
||||
static create(request) {
|
||||
const urlResult = Url_1.Url.create(request.url);
|
||||
if (!urlResult.ok) {
|
||||
return (0, Result_1.Err)(urlResult.error);
|
||||
}
|
||||
const props = {
|
||||
url: request.url,
|
||||
status: 'running',
|
||||
seed: request.seed,
|
||||
maxStates: request.maxStates,
|
||||
statesVisited: 0,
|
||||
config: request.config ?? {},
|
||||
};
|
||||
const session = new CrawlSession(props);
|
||||
session.addDomainEvent(new CrawlStarted_1.CrawlStarted(session.id.toString(), {
|
||||
url: request.url,
|
||||
seed: request.seed,
|
||||
maxStates: request.maxStates,
|
||||
}));
|
||||
return (0, Result_1.Ok)(session);
|
||||
}
|
||||
get url() {
|
||||
return this.props.url;
|
||||
}
|
||||
get status() {
|
||||
return this.props.status;
|
||||
}
|
||||
get seed() {
|
||||
return this.props.seed;
|
||||
}
|
||||
get maxStates() {
|
||||
return this.props.maxStates;
|
||||
}
|
||||
get statesVisited() {
|
||||
return this.props.statesVisited;
|
||||
}
|
||||
get config() {
|
||||
return this.props.config;
|
||||
}
|
||||
incrementStatesVisited() {
|
||||
this.props = { ...this.props, statesVisited: this.props.statesVisited + 1 };
|
||||
}
|
||||
complete() {
|
||||
this.props = { ...this.props, status: 'completed' };
|
||||
this.addDomainEvent(new CrawlCompleted_1.CrawlCompleted(this.id.toString(), {
|
||||
url: this.props.url,
|
||||
statesVisited: this.props.statesVisited,
|
||||
}));
|
||||
}
|
||||
fail(reason) {
|
||||
this.props = { ...this.props, status: 'failed' };
|
||||
this.addDomainEvent(new CrawlFailed_1.CrawlFailed(this.id.toString(), {
|
||||
url: this.props.url,
|
||||
reason,
|
||||
statesVisited: this.props.statesVisited,
|
||||
}));
|
||||
}
|
||||
stop() {
|
||||
this.props = { ...this.props, status: 'stopped' };
|
||||
this.addDomainEvent(new CrawlCompleted_1.CrawlCompleted(this.id.toString(), {
|
||||
url: this.props.url,
|
||||
statesVisited: this.props.statesVisited,
|
||||
stopped: true,
|
||||
}));
|
||||
}
|
||||
}
|
||||
exports.CrawlSession = CrawlSession;
|
||||
31
dist/modules/crawling/domain/entities/CrawlState.js
vendored
Normal file
31
dist/modules/crawling/domain/entities/CrawlState.js
vendored
Normal file
@@ -0,0 +1,31 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.CrawlState = void 0;
|
||||
const Entity_1 = require("../../../../shared/domain/Entity");
|
||||
class CrawlState extends Entity_1.Entity {
|
||||
constructor(props, id) {
|
||||
super(props, id);
|
||||
}
|
||||
static create(props, id) {
|
||||
return new CrawlState(props, id);
|
||||
}
|
||||
get url() {
|
||||
return this.props.url;
|
||||
}
|
||||
get title() {
|
||||
return this.props.title;
|
||||
}
|
||||
get domSnapshot() {
|
||||
return this.props.domSnapshot;
|
||||
}
|
||||
get visitCount() {
|
||||
return this.props.visitCount;
|
||||
}
|
||||
get stateId() {
|
||||
return this.props.stateId;
|
||||
}
|
||||
get sessionId() {
|
||||
return this.props.sessionId;
|
||||
}
|
||||
}
|
||||
exports.CrawlState = CrawlState;
|
||||
14
dist/modules/crawling/domain/events/ActionExecuted.js
vendored
Normal file
14
dist/modules/crawling/domain/events/ActionExecuted.js
vendored
Normal file
@@ -0,0 +1,14 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.ActionExecuted = void 0;
|
||||
const crypto_1 = require("crypto");
|
||||
class ActionExecuted {
|
||||
constructor(aggregateId, payload) {
|
||||
this.aggregateId = aggregateId;
|
||||
this.payload = payload;
|
||||
this.eventId = (0, crypto_1.randomUUID)();
|
||||
this.eventName = 'crawl.action_executed';
|
||||
this.occurredOn = new Date();
|
||||
}
|
||||
}
|
||||
exports.ActionExecuted = ActionExecuted;
|
||||
14
dist/modules/crawling/domain/events/CrawlCompleted.js
vendored
Normal file
14
dist/modules/crawling/domain/events/CrawlCompleted.js
vendored
Normal file
@@ -0,0 +1,14 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.CrawlCompleted = void 0;
|
||||
const crypto_1 = require("crypto");
|
||||
class CrawlCompleted {
|
||||
constructor(aggregateId, payload) {
|
||||
this.aggregateId = aggregateId;
|
||||
this.payload = payload;
|
||||
this.eventId = (0, crypto_1.randomUUID)();
|
||||
this.eventName = 'crawl.completed';
|
||||
this.occurredOn = new Date();
|
||||
}
|
||||
}
|
||||
exports.CrawlCompleted = CrawlCompleted;
|
||||
14
dist/modules/crawling/domain/events/CrawlFailed.js
vendored
Normal file
14
dist/modules/crawling/domain/events/CrawlFailed.js
vendored
Normal file
@@ -0,0 +1,14 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.CrawlFailed = void 0;
|
||||
const crypto_1 = require("crypto");
|
||||
class CrawlFailed {
|
||||
constructor(aggregateId, payload) {
|
||||
this.aggregateId = aggregateId;
|
||||
this.payload = payload;
|
||||
this.eventId = (0, crypto_1.randomUUID)();
|
||||
this.eventName = 'crawl.failed';
|
||||
this.occurredOn = new Date();
|
||||
}
|
||||
}
|
||||
exports.CrawlFailed = CrawlFailed;
|
||||
14
dist/modules/crawling/domain/events/CrawlStarted.js
vendored
Normal file
14
dist/modules/crawling/domain/events/CrawlStarted.js
vendored
Normal file
@@ -0,0 +1,14 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.CrawlStarted = void 0;
|
||||
const crypto_1 = require("crypto");
|
||||
class CrawlStarted {
|
||||
constructor(aggregateId, payload) {
|
||||
this.aggregateId = aggregateId;
|
||||
this.payload = payload;
|
||||
this.eventId = (0, crypto_1.randomUUID)();
|
||||
this.eventName = 'crawl.started';
|
||||
this.occurredOn = new Date();
|
||||
}
|
||||
}
|
||||
exports.CrawlStarted = CrawlStarted;
|
||||
14
dist/modules/crawling/domain/events/StateDiscovered.js
vendored
Normal file
14
dist/modules/crawling/domain/events/StateDiscovered.js
vendored
Normal file
@@ -0,0 +1,14 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.StateDiscovered = void 0;
|
||||
const crypto_1 = require("crypto");
|
||||
class StateDiscovered {
|
||||
constructor(aggregateId, payload) {
|
||||
this.aggregateId = aggregateId;
|
||||
this.payload = payload;
|
||||
this.eventId = (0, crypto_1.randomUUID)();
|
||||
this.eventName = 'crawl.state_discovered';
|
||||
this.occurredOn = new Date();
|
||||
}
|
||||
}
|
||||
exports.StateDiscovered = StateDiscovered;
|
||||
2
dist/modules/crawling/domain/ports/ICrawlSessionRepository.js
vendored
Normal file
2
dist/modules/crawling/domain/ports/ICrawlSessionRepository.js
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
2
dist/modules/crawling/domain/ports/ICrawlerEngine.js
vendored
Normal file
2
dist/modules/crawling/domain/ports/ICrawlerEngine.js
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
2
dist/modules/crawling/domain/ports/IStateRepository.js
vendored
Normal file
2
dist/modules/crawling/domain/ports/IStateRepository.js
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
20
dist/modules/crawling/domain/value-objects/Selector.js
vendored
Normal file
20
dist/modules/crawling/domain/value-objects/Selector.js
vendored
Normal file
@@ -0,0 +1,20 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.Selector = void 0;
|
||||
const ValueObject_1 = require("../../../../shared/domain/ValueObject");
|
||||
const Result_1 = require("../../../../shared/domain/Result");
|
||||
class Selector extends ValueObject_1.ValueObject {
|
||||
constructor(props) {
|
||||
super(props);
|
||||
}
|
||||
static create(raw) {
|
||||
if (!raw || raw.trim().length === 0) {
|
||||
return (0, Result_1.Err)('Selector must not be empty');
|
||||
}
|
||||
return (0, Result_1.Ok)(new Selector({ value: raw.trim() }));
|
||||
}
|
||||
toString() {
|
||||
return this.props.value;
|
||||
}
|
||||
}
|
||||
exports.Selector = Selector;
|
||||
21
dist/modules/crawling/domain/value-objects/SessionStatus.js
vendored
Normal file
21
dist/modules/crawling/domain/value-objects/SessionStatus.js
vendored
Normal file
@@ -0,0 +1,21 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.SessionStatus = void 0;
|
||||
const ValueObject_1 = require("../../../../shared/domain/ValueObject");
|
||||
const Result_1 = require("../../../../shared/domain/Result");
|
||||
const VALID_STATUSES = ['running', 'completed', 'failed', 'stopped'];
|
||||
class SessionStatus extends ValueObject_1.ValueObject {
|
||||
constructor(props) {
|
||||
super(props);
|
||||
}
|
||||
static create(val) {
|
||||
if (!VALID_STATUSES.includes(val)) {
|
||||
return (0, Result_1.Err)(`Invalid session status: "${val}". Must be one of: ${VALID_STATUSES.join(', ')}`);
|
||||
}
|
||||
return (0, Result_1.Ok)(new SessionStatus({ value: val }));
|
||||
}
|
||||
getValue() {
|
||||
return this.props.value;
|
||||
}
|
||||
}
|
||||
exports.SessionStatus = SessionStatus;
|
||||
24
dist/modules/crawling/domain/value-objects/Url.js
vendored
Normal file
24
dist/modules/crawling/domain/value-objects/Url.js
vendored
Normal file
@@ -0,0 +1,24 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.Url = void 0;
|
||||
const ValueObject_1 = require("../../../../shared/domain/ValueObject");
|
||||
const Result_1 = require("../../../../shared/domain/Result");
|
||||
class Url extends ValueObject_1.ValueObject {
|
||||
constructor(props) {
|
||||
super(props);
|
||||
}
|
||||
static create(raw) {
|
||||
if (!raw || raw.trim().length === 0) {
|
||||
return (0, Result_1.Err)('URL must not be empty');
|
||||
}
|
||||
const trimmed = raw.trim();
|
||||
if (!trimmed.startsWith('http://') && !trimmed.startsWith('https://')) {
|
||||
return (0, Result_1.Err)('URL must start with http:// or https://');
|
||||
}
|
||||
return (0, Result_1.Ok)(new Url({ value: trimmed }));
|
||||
}
|
||||
toString() {
|
||||
return this.props.value;
|
||||
}
|
||||
}
|
||||
exports.Url = Url;
|
||||
Reference in New Issue
Block a user