@ajna-inc/openbadges 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +202 -0
- package/build/OpenBadgesModule.d.ts +10 -0
- package/build/OpenBadgesModule.js +75 -0
- package/build/OpenBadgesModule.js.map +1 -0
- package/build/OpenBadgesModuleConfig.d.ts +96 -0
- package/build/OpenBadgesModuleConfig.js +50 -0
- package/build/OpenBadgesModuleConfig.js.map +1 -0
- package/build/api/OpenBadgesApi.d.ts +48 -0
- package/build/api/OpenBadgesApi.js +81 -0
- package/build/api/OpenBadgesApi.js.map +1 -0
- package/build/api/index.d.ts +1 -0
- package/build/api/index.js +18 -0
- package/build/api/index.js.map +1 -0
- package/build/constants.d.ts +12 -0
- package/build/constants.js +27 -0
- package/build/constants.js.map +1 -0
- package/build/cryptosuites/EcdsaSd2023.d.ts +143 -0
- package/build/cryptosuites/EcdsaSd2023.js +518 -0
- package/build/cryptosuites/EcdsaSd2023.js.map +1 -0
- package/build/cryptosuites/EddsaRdfc2022.d.ts +112 -0
- package/build/cryptosuites/EddsaRdfc2022.js +356 -0
- package/build/cryptosuites/EddsaRdfc2022.js.map +1 -0
- package/build/cryptosuites/constants.d.ts +14 -0
- package/build/cryptosuites/constants.js +22 -0
- package/build/cryptosuites/constants.js.map +1 -0
- package/build/cryptosuites/contextPreprocessor.d.ts +24 -0
- package/build/cryptosuites/contextPreprocessor.js +127 -0
- package/build/cryptosuites/contextPreprocessor.js.map +1 -0
- package/build/cryptosuites/dataIntegrityV2Context.d.ts +144 -0
- package/build/cryptosuites/dataIntegrityV2Context.js +86 -0
- package/build/cryptosuites/dataIntegrityV2Context.js.map +1 -0
- package/build/cryptosuites/index.d.ts +11 -0
- package/build/cryptosuites/index.js +33 -0
- package/build/cryptosuites/index.js.map +1 -0
- package/build/http/OpenBadgesHttpModule.d.ts +9 -0
- package/build/http/OpenBadgesHttpModule.js +120 -0
- package/build/http/OpenBadgesHttpModule.js.map +1 -0
- package/build/http/OpenBadgesHttpModuleConfig.d.ts +55 -0
- package/build/http/OpenBadgesHttpModuleConfig.js +78 -0
- package/build/http/OpenBadgesHttpModuleConfig.js.map +1 -0
- package/build/http/endpoints/authorize.d.ts +3 -0
- package/build/http/endpoints/authorize.js +79 -0
- package/build/http/endpoints/authorize.js.map +1 -0
- package/build/http/endpoints/consent.d.ts +3 -0
- package/build/http/endpoints/consent.js +25 -0
- package/build/http/endpoints/consent.js.map +1 -0
- package/build/http/endpoints/credentials.d.ts +4 -0
- package/build/http/endpoints/credentials.js +85 -0
- package/build/http/endpoints/credentials.js.map +1 -0
- package/build/http/endpoints/did.d.ts +3 -0
- package/build/http/endpoints/did.js +48 -0
- package/build/http/endpoints/did.js.map +1 -0
- package/build/http/endpoints/introspect.d.ts +3 -0
- package/build/http/endpoints/introspect.js +37 -0
- package/build/http/endpoints/introspect.js.map +1 -0
- package/build/http/endpoints/jwks.d.ts +3 -0
- package/build/http/endpoints/jwks.js +46 -0
- package/build/http/endpoints/jwks.js.map +1 -0
- package/build/http/endpoints/profile.d.ts +4 -0
- package/build/http/endpoints/profile.js +58 -0
- package/build/http/endpoints/profile.js.map +1 -0
- package/build/http/endpoints/refresh.d.ts +15 -0
- package/build/http/endpoints/refresh.js +134 -0
- package/build/http/endpoints/refresh.js.map +1 -0
- package/build/http/endpoints/registration.d.ts +3 -0
- package/build/http/endpoints/registration.js +42 -0
- package/build/http/endpoints/registration.js.map +1 -0
- package/build/http/endpoints/revoke.d.ts +3 -0
- package/build/http/endpoints/revoke.js +38 -0
- package/build/http/endpoints/revoke.js.map +1 -0
- package/build/http/endpoints/serviceDescription.d.ts +3 -0
- package/build/http/endpoints/serviceDescription.js +52 -0
- package/build/http/endpoints/serviceDescription.js.map +1 -0
- package/build/http/endpoints/statusList.d.ts +10 -0
- package/build/http/endpoints/statusList.js +95 -0
- package/build/http/endpoints/statusList.js.map +1 -0
- package/build/http/endpoints/token.d.ts +3 -0
- package/build/http/endpoints/token.js +147 -0
- package/build/http/endpoints/token.js.map +1 -0
- package/build/http/middleware/auth.d.ts +5 -0
- package/build/http/middleware/auth.js +48 -0
- package/build/http/middleware/auth.js.map +1 -0
- package/build/http/router.d.ts +13 -0
- package/build/http/router.js +36 -0
- package/build/http/router.js.map +1 -0
- package/build/http/tenants.d.ts +2 -0
- package/build/http/tenants.js +20 -0
- package/build/http/tenants.js.map +1 -0
- package/build/http/util/auth.d.ts +8 -0
- package/build/http/util/auth.js +43 -0
- package/build/http/util/auth.js.map +1 -0
- package/build/index.d.ts +46 -0
- package/build/index.js +71 -0
- package/build/index.js.map +1 -0
- package/build/models/ClrCredential.d.ts +112 -0
- package/build/models/ClrCredential.js +52 -0
- package/build/models/ClrCredential.js.map +1 -0
- package/build/models/EndorsementCredential.d.ts +89 -0
- package/build/models/EndorsementCredential.js +11 -0
- package/build/models/EndorsementCredential.js.map +1 -0
- package/build/models/StatusListCredential.d.ts +81 -0
- package/build/models/StatusListCredential.js +28 -0
- package/build/models/StatusListCredential.js.map +1 -0
- package/build/models/index.d.ts +8 -0
- package/build/models/index.js +25 -0
- package/build/models/index.js.map +1 -0
- package/build/repository/OpenBadgeCredentialRecord.d.ts +44 -0
- package/build/repository/OpenBadgeCredentialRecord.js +46 -0
- package/build/repository/OpenBadgeCredentialRecord.js.map +1 -0
- package/build/repository/OpenBadgeCredentialRepository.d.ts +8 -0
- package/build/repository/OpenBadgeCredentialRepository.js +38 -0
- package/build/repository/OpenBadgeCredentialRepository.js.map +1 -0
- package/build/repository/OpenBadgesAuthCodeRecord.d.ts +35 -0
- package/build/repository/OpenBadgesAuthCodeRecord.js +28 -0
- package/build/repository/OpenBadgesAuthCodeRecord.js.map +1 -0
- package/build/repository/OpenBadgesAuthCodeRepository.d.ts +6 -0
- package/build/repository/OpenBadgesAuthCodeRepository.js +32 -0
- package/build/repository/OpenBadgesAuthCodeRepository.js.map +1 -0
- package/build/repository/OpenBadgesConsentRecord.d.ts +24 -0
- package/build/repository/OpenBadgesConsentRecord.js +23 -0
- package/build/repository/OpenBadgesConsentRecord.js.map +1 -0
- package/build/repository/OpenBadgesConsentRepository.d.ts +6 -0
- package/build/repository/OpenBadgesConsentRepository.js +32 -0
- package/build/repository/OpenBadgesConsentRepository.js.map +1 -0
- package/build/repository/OpenBadgesKeyBindingRecord.d.ts +24 -0
- package/build/repository/OpenBadgesKeyBindingRecord.js +32 -0
- package/build/repository/OpenBadgesKeyBindingRecord.js.map +1 -0
- package/build/repository/OpenBadgesKeyBindingRepository.d.ts +7 -0
- package/build/repository/OpenBadgesKeyBindingRepository.js +35 -0
- package/build/repository/OpenBadgesKeyBindingRepository.js.map +1 -0
- package/build/repository/OpenBadgesOAuthRecord.d.ts +35 -0
- package/build/repository/OpenBadgesOAuthRecord.js +25 -0
- package/build/repository/OpenBadgesOAuthRecord.js.map +1 -0
- package/build/repository/OpenBadgesOAuthRepository.d.ts +8 -0
- package/build/repository/OpenBadgesOAuthRepository.js +38 -0
- package/build/repository/OpenBadgesOAuthRepository.js.map +1 -0
- package/build/repository/OpenBadgesProfileRecord.d.ts +21 -0
- package/build/repository/OpenBadgesProfileRecord.js +22 -0
- package/build/repository/OpenBadgesProfileRecord.js.map +1 -0
- package/build/repository/OpenBadgesProfileRepository.d.ts +6 -0
- package/build/repository/OpenBadgesProfileRepository.js +32 -0
- package/build/repository/OpenBadgesProfileRepository.js.map +1 -0
- package/build/repository/OpenBadgesRevocationCacheRecord.d.ts +23 -0
- package/build/repository/OpenBadgesRevocationCacheRecord.js +23 -0
- package/build/repository/OpenBadgesRevocationCacheRecord.js.map +1 -0
- package/build/repository/OpenBadgesRevocationCacheRepository.d.ts +6 -0
- package/build/repository/OpenBadgesRevocationCacheRepository.js +32 -0
- package/build/repository/OpenBadgesRevocationCacheRepository.js.map +1 -0
- package/build/repository/OpenBadgesServiceDescriptionRecord.d.ts +21 -0
- package/build/repository/OpenBadgesServiceDescriptionRecord.js +22 -0
- package/build/repository/OpenBadgesServiceDescriptionRecord.js.map +1 -0
- package/build/repository/OpenBadgesServiceDescriptionRepository.d.ts +6 -0
- package/build/repository/OpenBadgesServiceDescriptionRepository.js +32 -0
- package/build/repository/OpenBadgesServiceDescriptionRepository.js.map +1 -0
- package/build/repository/OpenBadgesTokenRecord.d.ts +39 -0
- package/build/repository/OpenBadgesTokenRecord.js +36 -0
- package/build/repository/OpenBadgesTokenRecord.js.map +1 -0
- package/build/repository/OpenBadgesTokenRepository.d.ts +9 -0
- package/build/repository/OpenBadgesTokenRepository.js +45 -0
- package/build/repository/OpenBadgesTokenRepository.js.map +1 -0
- package/build/repository/StatusListRecord.d.ts +49 -0
- package/build/repository/StatusListRecord.js +47 -0
- package/build/repository/StatusListRecord.js.map +1 -0
- package/build/repository/StatusListRepository.d.ts +24 -0
- package/build/repository/StatusListRepository.js +52 -0
- package/build/repository/StatusListRepository.js.map +1 -0
- package/build/repository/index.d.ts +18 -0
- package/build/repository/index.js +35 -0
- package/build/repository/index.js.map +1 -0
- package/build/services/AchievementValidator.d.ts +158 -0
- package/build/services/AchievementValidator.js +238 -0
- package/build/services/AchievementValidator.js.map +1 -0
- package/build/services/ConsumerService.d.ts +24 -0
- package/build/services/ConsumerService.js +143 -0
- package/build/services/ConsumerService.js.map +1 -0
- package/build/services/ContextService.d.ts +14 -0
- package/build/services/ContextService.js +54 -0
- package/build/services/ContextService.js.map +1 -0
- package/build/services/DataIntegrityService.d.ts +51 -0
- package/build/services/DataIntegrityService.js +134 -0
- package/build/services/DataIntegrityService.js.map +1 -0
- package/build/services/DidCommLinkService.d.ts +7 -0
- package/build/services/DidCommLinkService.js +20 -0
- package/build/services/DidCommLinkService.js.map +1 -0
- package/build/services/DisplayMapper.d.ts +9 -0
- package/build/services/DisplayMapper.js +26 -0
- package/build/services/DisplayMapper.js.map +1 -0
- package/build/services/IssuerService.d.ts +38 -0
- package/build/services/IssuerService.js +225 -0
- package/build/services/IssuerService.js.map +1 -0
- package/build/services/JwtService.d.ts +19 -0
- package/build/services/JwtService.js +229 -0
- package/build/services/JwtService.js.map +1 -0
- package/build/services/KeyService.d.ts +102 -0
- package/build/services/KeyService.js +439 -0
- package/build/services/KeyService.js.map +1 -0
- package/build/services/OAuthClient.d.ts +26 -0
- package/build/services/OAuthClient.js +127 -0
- package/build/services/OAuthClient.js.map +1 -0
- package/build/services/ProofService.d.ts +15 -0
- package/build/services/ProofService.js +43 -0
- package/build/services/ProofService.js.map +1 -0
- package/build/services/RevocationService.d.ts +59 -0
- package/build/services/RevocationService.js +319 -0
- package/build/services/RevocationService.js.map +1 -0
- package/build/services/VerifyService.d.ts +17 -0
- package/build/services/VerifyService.js +54 -0
- package/build/services/VerifyService.js.map +1 -0
- package/build/services/crypto/CryptoDriver.d.ts +9 -0
- package/build/services/crypto/CryptoDriver.js +7 -0
- package/build/services/crypto/CryptoDriver.js.map +1 -0
- package/build/services/crypto/JsonLdCryptoDriver.d.ts +17 -0
- package/build/services/crypto/JsonLdCryptoDriver.js +45 -0
- package/build/services/crypto/JsonLdCryptoDriver.js.map +1 -0
- package/build/services/crypto/JwtCryptoDriver.d.ts +13 -0
- package/build/services/crypto/JwtCryptoDriver.js +42 -0
- package/build/services/crypto/JwtCryptoDriver.js.map +1 -0
- package/build/services/index.d.ts +12 -0
- package/build/services/index.js +29 -0
- package/build/services/index.js.map +1 -0
- package/build/utils/validate.d.ts +17 -0
- package/build/utils/validate.js +107 -0
- package/build/utils/validate.js.map +1 -0
- package/package.json +57 -0
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* StatusListRecord
|
|
4
|
+
*
|
|
5
|
+
* Stores issuer-side status list data including the bitstring and allocation state.
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.StatusListRecord = void 0;
|
|
9
|
+
const core_1 = require("@credo-ts/core");
|
|
10
|
+
class StatusListRecord extends core_1.BaseRecord {
|
|
11
|
+
constructor(props) {
|
|
12
|
+
super();
|
|
13
|
+
this.type = StatusListRecord.type;
|
|
14
|
+
if (props) {
|
|
15
|
+
this.id = props.id ?? props.listId ?? core_1.utils.uuid();
|
|
16
|
+
this.createdAt = props.createdAt ?? new Date();
|
|
17
|
+
this.updatedAt = props.updatedAt ?? new Date();
|
|
18
|
+
this.listId = props.listId;
|
|
19
|
+
this.issuerDid = props.issuerDid;
|
|
20
|
+
this.purpose = props.purpose;
|
|
21
|
+
this.bitstringBase64 = props.bitstringBase64;
|
|
22
|
+
this.capacity = props.capacity;
|
|
23
|
+
this.nextIndex = props.nextIndex;
|
|
24
|
+
this.credentialIndexMap = props.credentialIndexMap;
|
|
25
|
+
this.baseUrl = props.baseUrl;
|
|
26
|
+
this._tags = props.tags ?? {};
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
this.id = core_1.utils.uuid();
|
|
30
|
+
this.createdAt = new Date();
|
|
31
|
+
this.updatedAt = new Date();
|
|
32
|
+
this.credentialIndexMap = {};
|
|
33
|
+
this._tags = {};
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
getTags() {
|
|
37
|
+
return {
|
|
38
|
+
...this._tags,
|
|
39
|
+
listId: this.listId,
|
|
40
|
+
issuerDid: this.issuerDid,
|
|
41
|
+
purpose: this.purpose,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
exports.StatusListRecord = StatusListRecord;
|
|
46
|
+
StatusListRecord.type = 'StatusListRecord';
|
|
47
|
+
//# sourceMappingURL=StatusListRecord.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StatusListRecord.js","sourceRoot":"","sources":["../../src/repository/StatusListRecord.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAGH,yCAAkD;AAgClD,MAAa,gBAAiB,SAAQ,iBAA2C;IAa/E,YAAmB,KAA6B;QAC9C,KAAK,EAAE,CAAA;QAHO,SAAI,GAAG,gBAAgB,CAAC,IAAI,CAAA;QAI1C,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,CAAC,EAAE,GAAG,KAAK,CAAC,EAAE,IAAI,KAAK,CAAC,MAAM,IAAI,YAAK,CAAC,IAAI,EAAE,CAAA;YAClD,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS,IAAI,IAAI,IAAI,EAAE,CAAA;YAC9C,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS,IAAI,IAAI,IAAI,EAAE,CAAA;YAC9C,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAA;YAC1B,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS,CAAA;YAChC,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAA;YAC5B,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC,eAAe,CAAA;YAC5C,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAA;YAC9B,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS,CAAA;YAChC,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC,kBAAkB,CAAA;YAClD,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAA;YAC5B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,IAAI,EAAE,CAAA;QAC/B,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,EAAE,GAAG,YAAK,CAAC,IAAI,EAAE,CAAA;YACtB,IAAI,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAA;YAC3B,IAAI,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAA;YAC3B,IAAI,CAAC,kBAAkB,GAAG,EAAE,CAAA;YAC5B,IAAI,CAAC,KAAK,GAAG,EAAE,CAAA;QACjB,CAAC;IACH,CAAC;IAEM,OAAO;QACZ,OAAO;YACL,GAAG,IAAI,CAAC,KAAK;YACb,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,OAAO,EAAE,IAAI,CAAC,OAAO;SACtB,CAAA;IACH,CAAC;;AA5CH,4CA6CC;AAnCwB,qBAAI,GAAG,kBAAkB,AAArB,CAAqB"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* StatusListRepository
|
|
3
|
+
*
|
|
4
|
+
* Repository for managing StatusListRecord storage and retrieval.
|
|
5
|
+
*/
|
|
6
|
+
import { StorageService, EventEmitter, Repository } from '@credo-ts/core';
|
|
7
|
+
import type { AgentContext } from '@credo-ts/core';
|
|
8
|
+
import { StatusListRecord } from './StatusListRecord';
|
|
9
|
+
import type { StatusPurpose } from '../models/StatusListCredential';
|
|
10
|
+
export declare class StatusListRepository extends Repository<StatusListRecord> {
|
|
11
|
+
constructor(storageService: StorageService<StatusListRecord>, eventEmitter: EventEmitter);
|
|
12
|
+
/**
|
|
13
|
+
* Find a status list by its unique list ID
|
|
14
|
+
*/
|
|
15
|
+
findByListId(agentContext: AgentContext, listId: string): Promise<StatusListRecord | null>;
|
|
16
|
+
/**
|
|
17
|
+
* Find all status lists for an issuer
|
|
18
|
+
*/
|
|
19
|
+
findByIssuer(agentContext: AgentContext, issuerDid: string): Promise<StatusListRecord[]>;
|
|
20
|
+
/**
|
|
21
|
+
* Find status lists by issuer and purpose
|
|
22
|
+
*/
|
|
23
|
+
findByIssuerAndPurpose(agentContext: AgentContext, issuerDid: string, purpose: StatusPurpose): Promise<StatusListRecord[]>;
|
|
24
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* StatusListRepository
|
|
4
|
+
*
|
|
5
|
+
* Repository for managing StatusListRecord storage and retrieval.
|
|
6
|
+
*/
|
|
7
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
8
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
10
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
11
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
12
|
+
};
|
|
13
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
14
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
15
|
+
};
|
|
16
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
17
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
18
|
+
};
|
|
19
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
|
+
exports.StatusListRepository = void 0;
|
|
21
|
+
const core_1 = require("@credo-ts/core");
|
|
22
|
+
const StatusListRecord_1 = require("./StatusListRecord");
|
|
23
|
+
let StatusListRepository = class StatusListRepository extends core_1.Repository {
|
|
24
|
+
constructor(storageService, eventEmitter) {
|
|
25
|
+
super(StatusListRecord_1.StatusListRecord, storageService, eventEmitter);
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Find a status list by its unique list ID
|
|
29
|
+
*/
|
|
30
|
+
async findByListId(agentContext, listId) {
|
|
31
|
+
return this.findSingleByQuery(agentContext, { listId });
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Find all status lists for an issuer
|
|
35
|
+
*/
|
|
36
|
+
async findByIssuer(agentContext, issuerDid) {
|
|
37
|
+
return this.findByQuery(agentContext, { issuerDid });
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Find status lists by issuer and purpose
|
|
41
|
+
*/
|
|
42
|
+
async findByIssuerAndPurpose(agentContext, issuerDid, purpose) {
|
|
43
|
+
return this.findByQuery(agentContext, { issuerDid, purpose });
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
exports.StatusListRepository = StatusListRepository;
|
|
47
|
+
exports.StatusListRepository = StatusListRepository = __decorate([
|
|
48
|
+
(0, core_1.injectable)(),
|
|
49
|
+
__param(0, (0, core_1.inject)(core_1.InjectionSymbols.StorageService)),
|
|
50
|
+
__metadata("design:paramtypes", [Object, core_1.EventEmitter])
|
|
51
|
+
], StatusListRepository);
|
|
52
|
+
//# sourceMappingURL=StatusListRepository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StatusListRepository.js","sourceRoot":"","sources":["../../src/repository/StatusListRepository.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;;;;;;;;;;;;;AAEH,yCAA+G;AAE/G,yDAAqD;AAI9C,IAAM,oBAAoB,GAA1B,MAAM,oBAAqB,SAAQ,iBAA4B;IACpE,YAC2C,cAAgD,EACzF,YAA0B;QAE1B,KAAK,CAAC,mCAAgB,EAAE,cAAc,EAAE,YAAY,CAAC,CAAA;IACvD,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,YAAY,CAAC,YAA0B,EAAE,MAAc;QAClE,OAAO,IAAI,CAAC,iBAAiB,CAAC,YAAY,EAAE,EAAE,MAAM,EAAE,CAAC,CAAA;IACzD,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,YAAY,CAAC,YAA0B,EAAE,SAAiB;QACrE,OAAO,IAAI,CAAC,WAAW,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,CAAC,CAAA;IACtD,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,sBAAsB,CACjC,YAA0B,EAC1B,SAAiB,EACjB,OAAsB;QAEtB,OAAO,IAAI,CAAC,WAAW,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAA;IAC/D,CAAC;CACF,CAAA;AAhCY,oDAAoB;+BAApB,oBAAoB;IADhC,IAAA,iBAAU,GAAE;IAGR,WAAA,IAAA,aAAM,EAAC,uBAAgB,CAAC,cAAc,CAAC,CAAA;6CAC1B,mBAAY;GAHjB,oBAAoB,CAgChC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export * from './OpenBadgeCredentialRecord';
|
|
2
|
+
export * from './OpenBadgeCredentialRepository';
|
|
3
|
+
export * from './OpenBadgesProfileRecord';
|
|
4
|
+
export * from './OpenBadgesProfileRepository';
|
|
5
|
+
export * from './OpenBadgesServiceDescriptionRecord';
|
|
6
|
+
export * from './OpenBadgesServiceDescriptionRepository';
|
|
7
|
+
export * from './OpenBadgesOAuthRecord';
|
|
8
|
+
export * from './OpenBadgesOAuthRepository';
|
|
9
|
+
export * from './OpenBadgesRevocationCacheRecord';
|
|
10
|
+
export * from './OpenBadgesRevocationCacheRepository';
|
|
11
|
+
export * from './OpenBadgesAuthCodeRecord';
|
|
12
|
+
export * from './OpenBadgesAuthCodeRepository';
|
|
13
|
+
export * from './OpenBadgesTokenRecord';
|
|
14
|
+
export * from './OpenBadgesTokenRepository';
|
|
15
|
+
export * from './OpenBadgesConsentRecord';
|
|
16
|
+
export * from './OpenBadgesConsentRepository';
|
|
17
|
+
export * from './OpenBadgesKeyBindingRecord';
|
|
18
|
+
export * from './OpenBadgesKeyBindingRepository';
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./OpenBadgeCredentialRecord"), exports);
|
|
18
|
+
__exportStar(require("./OpenBadgeCredentialRepository"), exports);
|
|
19
|
+
__exportStar(require("./OpenBadgesProfileRecord"), exports);
|
|
20
|
+
__exportStar(require("./OpenBadgesProfileRepository"), exports);
|
|
21
|
+
__exportStar(require("./OpenBadgesServiceDescriptionRecord"), exports);
|
|
22
|
+
__exportStar(require("./OpenBadgesServiceDescriptionRepository"), exports);
|
|
23
|
+
__exportStar(require("./OpenBadgesOAuthRecord"), exports);
|
|
24
|
+
__exportStar(require("./OpenBadgesOAuthRepository"), exports);
|
|
25
|
+
__exportStar(require("./OpenBadgesRevocationCacheRecord"), exports);
|
|
26
|
+
__exportStar(require("./OpenBadgesRevocationCacheRepository"), exports);
|
|
27
|
+
__exportStar(require("./OpenBadgesAuthCodeRecord"), exports);
|
|
28
|
+
__exportStar(require("./OpenBadgesAuthCodeRepository"), exports);
|
|
29
|
+
__exportStar(require("./OpenBadgesTokenRecord"), exports);
|
|
30
|
+
__exportStar(require("./OpenBadgesTokenRepository"), exports);
|
|
31
|
+
__exportStar(require("./OpenBadgesConsentRecord"), exports);
|
|
32
|
+
__exportStar(require("./OpenBadgesConsentRepository"), exports);
|
|
33
|
+
__exportStar(require("./OpenBadgesKeyBindingRecord"), exports);
|
|
34
|
+
__exportStar(require("./OpenBadgesKeyBindingRepository"), exports);
|
|
35
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/repository/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,8DAA2C;AAC3C,kEAA+C;AAC/C,4DAAyC;AACzC,gEAA6C;AAC7C,uEAAoD;AACpD,2EAAwD;AACxD,0DAAuC;AACvC,8DAA2C;AAC3C,oEAAiD;AACjD,wEAAqD;AACrD,6DAA0C;AAC1C,iEAA8C;AAC9C,0DAAuC;AACvC,8DAA2C;AAC3C,4DAAyC;AACzC,gEAA6C;AAC7C,+DAA4C;AAC5C,mEAAgD"}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Achievement Validator Service
|
|
3
|
+
*
|
|
4
|
+
* Validates Achievement structures before credential issuance according to
|
|
5
|
+
* OpenBadges 3.0 specification requirements.
|
|
6
|
+
*
|
|
7
|
+
* @see https://www.imsglobal.org/spec/ob/v3p0/#achievement
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Result of an achievement validation
|
|
11
|
+
*/
|
|
12
|
+
export interface ValidationResult {
|
|
13
|
+
/** Whether the achievement is valid */
|
|
14
|
+
valid: boolean;
|
|
15
|
+
/** Critical errors that must be fixed */
|
|
16
|
+
errors: string[];
|
|
17
|
+
/** Recommendations that don't prevent issuance */
|
|
18
|
+
warnings: string[];
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Image object structure
|
|
22
|
+
*/
|
|
23
|
+
export interface AchievementImage {
|
|
24
|
+
/** URI of the image */
|
|
25
|
+
id: string;
|
|
26
|
+
/** Must be 'Image' */
|
|
27
|
+
type?: 'Image';
|
|
28
|
+
/** Caption for the image */
|
|
29
|
+
caption?: string;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Criteria for achieving the achievement
|
|
33
|
+
*/
|
|
34
|
+
export interface AchievementCriteria {
|
|
35
|
+
/** URI to criteria document */
|
|
36
|
+
id?: string;
|
|
37
|
+
/** Human-readable narrative describing how to achieve */
|
|
38
|
+
narrative?: string;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Alignment to external standards or frameworks
|
|
42
|
+
*/
|
|
43
|
+
export interface Alignment {
|
|
44
|
+
/** Must be 'Alignment' */
|
|
45
|
+
type: 'Alignment';
|
|
46
|
+
/** Name of the target standard/framework */
|
|
47
|
+
targetName: string;
|
|
48
|
+
/** URL of the target standard/framework */
|
|
49
|
+
targetUrl: string;
|
|
50
|
+
/** Description of the target */
|
|
51
|
+
targetDescription?: string;
|
|
52
|
+
/** Name of the framework */
|
|
53
|
+
targetFramework?: string;
|
|
54
|
+
/** Code within the framework */
|
|
55
|
+
targetCode?: string;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Related achievement reference
|
|
59
|
+
*/
|
|
60
|
+
export interface Related {
|
|
61
|
+
/** URI of the related achievement */
|
|
62
|
+
id: string;
|
|
63
|
+
/** Type (should include 'Related') */
|
|
64
|
+
type?: string | string[];
|
|
65
|
+
/** Optional version */
|
|
66
|
+
version?: string;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Result description for rubric-based achievements
|
|
70
|
+
*/
|
|
71
|
+
export interface ResultDescription {
|
|
72
|
+
/** URI for this result description */
|
|
73
|
+
id: string;
|
|
74
|
+
/** Must be 'ResultDescription' */
|
|
75
|
+
type: 'ResultDescription';
|
|
76
|
+
/** Name of the result */
|
|
77
|
+
name: string;
|
|
78
|
+
/** Rubric criteria text */
|
|
79
|
+
resultType?: string;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Achievement structure as per OpenBadges 3.0 spec
|
|
83
|
+
*/
|
|
84
|
+
export interface Achievement {
|
|
85
|
+
/** Must include 'Achievement' */
|
|
86
|
+
type: 'Achievement' | ['Achievement', ...string[]];
|
|
87
|
+
/** URI identifying this achievement */
|
|
88
|
+
id?: string;
|
|
89
|
+
/** Name of the achievement (REQUIRED) */
|
|
90
|
+
name: string;
|
|
91
|
+
/** Description of the achievement */
|
|
92
|
+
description?: string;
|
|
93
|
+
/** Criteria for earning this achievement */
|
|
94
|
+
criteria?: AchievementCriteria;
|
|
95
|
+
/** Image representing the achievement */
|
|
96
|
+
image?: AchievementImage | string;
|
|
97
|
+
/** Type of achievement (e.g., 'Certificate', 'Badge') */
|
|
98
|
+
achievementType?: string;
|
|
99
|
+
/** Alignment to external frameworks */
|
|
100
|
+
alignment?: Alignment[];
|
|
101
|
+
/** Creator/issuer of the achievement definition */
|
|
102
|
+
creator?: {
|
|
103
|
+
id: string;
|
|
104
|
+
type?: string;
|
|
105
|
+
name?: string;
|
|
106
|
+
};
|
|
107
|
+
/** Evidence requirements */
|
|
108
|
+
creditsAvailable?: number;
|
|
109
|
+
/** Human-readable code */
|
|
110
|
+
humanCode?: string;
|
|
111
|
+
/** Related achievements */
|
|
112
|
+
related?: Related[];
|
|
113
|
+
/** Result descriptions for rubrics */
|
|
114
|
+
resultDescription?: ResultDescription[];
|
|
115
|
+
/** Specialization of another achievement */
|
|
116
|
+
specialization?: string;
|
|
117
|
+
/** Tags for categorization */
|
|
118
|
+
tag?: string[];
|
|
119
|
+
/** Version of the achievement */
|
|
120
|
+
version?: string;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Validates Achievement structures before credential issuance
|
|
124
|
+
*/
|
|
125
|
+
export declare class AchievementValidator {
|
|
126
|
+
/**
|
|
127
|
+
* Validates the basic structure of an Achievement
|
|
128
|
+
* Checks for required fields and correct types
|
|
129
|
+
*/
|
|
130
|
+
validateStructure(achievement: Partial<Achievement>): ValidationResult;
|
|
131
|
+
/**
|
|
132
|
+
* Validates achievement criteria
|
|
133
|
+
* Criteria must have either an id (URL) or a narrative, preferably both
|
|
134
|
+
*/
|
|
135
|
+
validateCriteria(achievement: Partial<Achievement>): ValidationResult;
|
|
136
|
+
/**
|
|
137
|
+
* Validates achievement image
|
|
138
|
+
*/
|
|
139
|
+
validateImage(achievement: Partial<Achievement>): ValidationResult;
|
|
140
|
+
/**
|
|
141
|
+
* Validates alignment array
|
|
142
|
+
*/
|
|
143
|
+
validateAlignment(alignments: Alignment[] | undefined): ValidationResult;
|
|
144
|
+
/**
|
|
145
|
+
* Validates result descriptions (for rubric-based achievements)
|
|
146
|
+
*/
|
|
147
|
+
validateResultDescriptions(resultDescriptions: ResultDescription[] | undefined): ValidationResult;
|
|
148
|
+
/**
|
|
149
|
+
* Validates all aspects of an Achievement
|
|
150
|
+
* Combines structure, criteria, image, and alignment validation
|
|
151
|
+
*/
|
|
152
|
+
validateAll(achievement: Partial<Achievement>): ValidationResult;
|
|
153
|
+
/**
|
|
154
|
+
* Quick check if an achievement is minimally valid
|
|
155
|
+
* Only checks required fields, not recommendations
|
|
156
|
+
*/
|
|
157
|
+
isValid(achievement: Partial<Achievement>): boolean;
|
|
158
|
+
}
|
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Achievement Validator Service
|
|
4
|
+
*
|
|
5
|
+
* Validates Achievement structures before credential issuance according to
|
|
6
|
+
* OpenBadges 3.0 specification requirements.
|
|
7
|
+
*
|
|
8
|
+
* @see https://www.imsglobal.org/spec/ob/v3p0/#achievement
|
|
9
|
+
*/
|
|
10
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
11
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
12
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
13
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
14
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.AchievementValidator = void 0;
|
|
18
|
+
const core_1 = require("@credo-ts/core");
|
|
19
|
+
/**
|
|
20
|
+
* URL validation regex
|
|
21
|
+
*/
|
|
22
|
+
const URL_REGEX = /^(https?|urn):\/?\/?[^\s]+$/i;
|
|
23
|
+
/**
|
|
24
|
+
* Validates Achievement structures before credential issuance
|
|
25
|
+
*/
|
|
26
|
+
let AchievementValidator = class AchievementValidator {
|
|
27
|
+
/**
|
|
28
|
+
* Validates the basic structure of an Achievement
|
|
29
|
+
* Checks for required fields and correct types
|
|
30
|
+
*/
|
|
31
|
+
validateStructure(achievement) {
|
|
32
|
+
const errors = [];
|
|
33
|
+
const warnings = [];
|
|
34
|
+
// Required field: name
|
|
35
|
+
if (!achievement.name || typeof achievement.name !== 'string') {
|
|
36
|
+
errors.push('Achievement.name is required and must be a string');
|
|
37
|
+
}
|
|
38
|
+
else if (achievement.name.trim().length === 0) {
|
|
39
|
+
errors.push('Achievement.name must not be empty');
|
|
40
|
+
}
|
|
41
|
+
// Required field: type must include 'Achievement'
|
|
42
|
+
if (!achievement.type) {
|
|
43
|
+
errors.push('Achievement.type is required');
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
const types = Array.isArray(achievement.type) ? achievement.type : [achievement.type];
|
|
47
|
+
if (!types.includes('Achievement')) {
|
|
48
|
+
errors.push("Achievement.type must include 'Achievement'");
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
// Recommended: id
|
|
52
|
+
if (!achievement.id) {
|
|
53
|
+
warnings.push('Achievement.id is recommended for persistent identification');
|
|
54
|
+
}
|
|
55
|
+
else if (typeof achievement.id === 'string' && !URL_REGEX.test(achievement.id)) {
|
|
56
|
+
warnings.push('Achievement.id should be a valid URI (URL or URN)');
|
|
57
|
+
}
|
|
58
|
+
// Recommended: description
|
|
59
|
+
if (!achievement.description) {
|
|
60
|
+
warnings.push('Achievement.description is recommended for accessibility');
|
|
61
|
+
}
|
|
62
|
+
return {
|
|
63
|
+
valid: errors.length === 0,
|
|
64
|
+
errors,
|
|
65
|
+
warnings,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Validates achievement criteria
|
|
70
|
+
* Criteria must have either an id (URL) or a narrative, preferably both
|
|
71
|
+
*/
|
|
72
|
+
validateCriteria(achievement) {
|
|
73
|
+
const errors = [];
|
|
74
|
+
const warnings = [];
|
|
75
|
+
if (!achievement.criteria) {
|
|
76
|
+
warnings.push('Achievement.criteria is recommended');
|
|
77
|
+
return { valid: true, errors, warnings };
|
|
78
|
+
}
|
|
79
|
+
const criteria = achievement.criteria;
|
|
80
|
+
// At least one of id or narrative should be present
|
|
81
|
+
if (!criteria.id && !criteria.narrative) {
|
|
82
|
+
errors.push('Achievement.criteria must have either id (URL) or narrative');
|
|
83
|
+
}
|
|
84
|
+
// If id is present, validate URL format
|
|
85
|
+
if (criteria.id && !URL_REGEX.test(criteria.id)) {
|
|
86
|
+
errors.push('Achievement.criteria.id must be a valid URL');
|
|
87
|
+
}
|
|
88
|
+
// Narrative should not be empty if present
|
|
89
|
+
if (criteria.narrative !== undefined && criteria.narrative.trim().length === 0) {
|
|
90
|
+
errors.push('Achievement.criteria.narrative must not be empty if provided');
|
|
91
|
+
}
|
|
92
|
+
// Recommend having both
|
|
93
|
+
if (criteria.id && !criteria.narrative) {
|
|
94
|
+
warnings.push('Consider adding criteria.narrative for human readability');
|
|
95
|
+
}
|
|
96
|
+
if (criteria.narrative && !criteria.id) {
|
|
97
|
+
warnings.push('Consider adding criteria.id for machine-readable reference');
|
|
98
|
+
}
|
|
99
|
+
return {
|
|
100
|
+
valid: errors.length === 0,
|
|
101
|
+
errors,
|
|
102
|
+
warnings,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Validates achievement image
|
|
107
|
+
*/
|
|
108
|
+
validateImage(achievement) {
|
|
109
|
+
const errors = [];
|
|
110
|
+
const warnings = [];
|
|
111
|
+
if (!achievement.image) {
|
|
112
|
+
warnings.push('Achievement.image is recommended for visual representation');
|
|
113
|
+
return { valid: true, errors, warnings };
|
|
114
|
+
}
|
|
115
|
+
const image = achievement.image;
|
|
116
|
+
// Image can be a string URL or an object
|
|
117
|
+
if (typeof image === 'string') {
|
|
118
|
+
if (!URL_REGEX.test(image)) {
|
|
119
|
+
errors.push('Achievement.image must be a valid URL');
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
else if (typeof image === 'object') {
|
|
123
|
+
if (!image.id) {
|
|
124
|
+
errors.push('Achievement.image.id is required');
|
|
125
|
+
}
|
|
126
|
+
else if (!URL_REGEX.test(image.id)) {
|
|
127
|
+
errors.push('Achievement.image.id must be a valid URL');
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
errors.push('Achievement.image must be a URL string or an Image object');
|
|
132
|
+
}
|
|
133
|
+
return {
|
|
134
|
+
valid: errors.length === 0,
|
|
135
|
+
errors,
|
|
136
|
+
warnings,
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Validates alignment array
|
|
141
|
+
*/
|
|
142
|
+
validateAlignment(alignments) {
|
|
143
|
+
const errors = [];
|
|
144
|
+
const warnings = [];
|
|
145
|
+
if (!alignments || alignments.length === 0) {
|
|
146
|
+
return { valid: true, errors, warnings };
|
|
147
|
+
}
|
|
148
|
+
alignments.forEach((alignment, index) => {
|
|
149
|
+
const prefix = `Alignment[${index}]`;
|
|
150
|
+
// Required: type
|
|
151
|
+
if (alignment.type !== 'Alignment') {
|
|
152
|
+
errors.push(`${prefix}.type must be 'Alignment'`);
|
|
153
|
+
}
|
|
154
|
+
// Required: targetName
|
|
155
|
+
if (!alignment.targetName || typeof alignment.targetName !== 'string') {
|
|
156
|
+
errors.push(`${prefix}.targetName is required`);
|
|
157
|
+
}
|
|
158
|
+
// Required: targetUrl
|
|
159
|
+
if (!alignment.targetUrl) {
|
|
160
|
+
errors.push(`${prefix}.targetUrl is required`);
|
|
161
|
+
}
|
|
162
|
+
else if (!URL_REGEX.test(alignment.targetUrl)) {
|
|
163
|
+
errors.push(`${prefix}.targetUrl must be a valid URL`);
|
|
164
|
+
}
|
|
165
|
+
// Recommended fields
|
|
166
|
+
if (!alignment.targetDescription) {
|
|
167
|
+
warnings.push(`${prefix}.targetDescription is recommended`);
|
|
168
|
+
}
|
|
169
|
+
});
|
|
170
|
+
return {
|
|
171
|
+
valid: errors.length === 0,
|
|
172
|
+
errors,
|
|
173
|
+
warnings,
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Validates result descriptions (for rubric-based achievements)
|
|
178
|
+
*/
|
|
179
|
+
validateResultDescriptions(resultDescriptions) {
|
|
180
|
+
const errors = [];
|
|
181
|
+
const warnings = [];
|
|
182
|
+
if (!resultDescriptions || resultDescriptions.length === 0) {
|
|
183
|
+
return { valid: true, errors, warnings };
|
|
184
|
+
}
|
|
185
|
+
resultDescriptions.forEach((rd, index) => {
|
|
186
|
+
const prefix = `ResultDescription[${index}]`;
|
|
187
|
+
// Required: id
|
|
188
|
+
if (!rd.id) {
|
|
189
|
+
errors.push(`${prefix}.id is required`);
|
|
190
|
+
}
|
|
191
|
+
// Required: type
|
|
192
|
+
if (rd.type !== 'ResultDescription') {
|
|
193
|
+
errors.push(`${prefix}.type must be 'ResultDescription'`);
|
|
194
|
+
}
|
|
195
|
+
// Required: name
|
|
196
|
+
if (!rd.name || typeof rd.name !== 'string') {
|
|
197
|
+
errors.push(`${prefix}.name is required`);
|
|
198
|
+
}
|
|
199
|
+
});
|
|
200
|
+
return {
|
|
201
|
+
valid: errors.length === 0,
|
|
202
|
+
errors,
|
|
203
|
+
warnings,
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Validates all aspects of an Achievement
|
|
208
|
+
* Combines structure, criteria, image, and alignment validation
|
|
209
|
+
*/
|
|
210
|
+
validateAll(achievement) {
|
|
211
|
+
const results = [
|
|
212
|
+
this.validateStructure(achievement),
|
|
213
|
+
this.validateCriteria(achievement),
|
|
214
|
+
this.validateImage(achievement),
|
|
215
|
+
this.validateAlignment(achievement.alignment),
|
|
216
|
+
this.validateResultDescriptions(achievement.resultDescription),
|
|
217
|
+
];
|
|
218
|
+
const errors = results.flatMap((r) => r.errors);
|
|
219
|
+
const warnings = results.flatMap((r) => r.warnings);
|
|
220
|
+
return {
|
|
221
|
+
valid: errors.length === 0,
|
|
222
|
+
errors,
|
|
223
|
+
warnings,
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Quick check if an achievement is minimally valid
|
|
228
|
+
* Only checks required fields, not recommendations
|
|
229
|
+
*/
|
|
230
|
+
isValid(achievement) {
|
|
231
|
+
return this.validateAll(achievement).valid;
|
|
232
|
+
}
|
|
233
|
+
};
|
|
234
|
+
exports.AchievementValidator = AchievementValidator;
|
|
235
|
+
exports.AchievementValidator = AchievementValidator = __decorate([
|
|
236
|
+
(0, core_1.injectable)()
|
|
237
|
+
], AchievementValidator);
|
|
238
|
+
//# sourceMappingURL=AchievementValidator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AchievementValidator.js","sourceRoot":"","sources":["../../src/services/AchievementValidator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { AgentContext } from '@credo-ts/core';
|
|
2
|
+
import { OpenBadgesServiceDescriptionRepository } from '../repository/OpenBadgesServiceDescriptionRepository';
|
|
3
|
+
import { OpenBadgesOAuthRepository } from '../repository/OpenBadgesOAuthRepository';
|
|
4
|
+
import { OAuthClient } from './OAuthClient';
|
|
5
|
+
export declare class ConsumerService {
|
|
6
|
+
private readonly sddRepo;
|
|
7
|
+
private readonly oauthRepo;
|
|
8
|
+
private readonly oauth;
|
|
9
|
+
constructor(sddRepo: OpenBadgesServiceDescriptionRepository, oauthRepo: OpenBadgesOAuthRepository, oauth: OAuthClient);
|
|
10
|
+
importFromUrl(agentContext: AgentContext, url: string, options?: {
|
|
11
|
+
discoveryUrl?: string;
|
|
12
|
+
}): Promise<{
|
|
13
|
+
discovery: any;
|
|
14
|
+
registration: {
|
|
15
|
+
client_id: string;
|
|
16
|
+
redirect_uris?: string[];
|
|
17
|
+
scope?: string;
|
|
18
|
+
};
|
|
19
|
+
authorizationUrl: string;
|
|
20
|
+
host: string;
|
|
21
|
+
}>;
|
|
22
|
+
ensureServiceDescription(agentContext: AgentContext, discoveryUrl: string): Promise<any>;
|
|
23
|
+
upsertToRemote(agentContext: AgentContext, baseUrl: string, credential: unknown): Promise<unknown>;
|
|
24
|
+
}
|