Add per provider addon id validation

This commit is contained in:
jliddev
2020-11-18 11:36:32 -06:00
parent 78df632664
commit a79ade2efd
7 changed files with 41 additions and 14 deletions

View File

@@ -26,6 +26,7 @@ export interface AddonProvider {
getById(addonId: string, clientType: WowClientType): Observable<AddonSearchResult>;
isValidAddonUri(addonUri: URL): boolean;
isValidAddonId(addonId: string): boolean;
onPostInstall(addon: Addon): void;

View File

@@ -342,6 +342,10 @@ export class CurseAddonProvider implements AddonProvider {
return addonUri.host && addonUri.host.endsWith("curseforge.com") && addonUri.pathname.startsWith("/wow/addons");
}
isValidAddonId(addonId: string): boolean {
return !!addonId && !isNaN(parseInt(addonId, 10));
}
onPostInstall(addon: Addon): void {
throw new Error("Method not implemented.");
}

View File

@@ -148,6 +148,10 @@ export class GitHubAddonProvider implements AddonProvider {
return addonUri.host && addonUri.host.endsWith("github.com");
}
public isValidAddonId(addonId: string): boolean {
return addonId.indexOf("/") !== -1;
}
public onPostInstall(addon: Addon): void {}
public async scan(

View File

@@ -108,6 +108,10 @@ export class TukUiAddonProvider implements AddonProvider {
return false;
}
isValidAddonId(addonId: string): boolean {
return !!addonId && !isNaN(parseInt(addonId, 10));
}
onPostInstall(addon: Addon): void {}
async scan(

View File

@@ -88,17 +88,21 @@ export class WowInterfaceAddonProvider implements AddonProvider {
throw new Error("Method not implemented.");
}
getById(addonId: string, clientType: WowClientType): Observable<AddonSearchResult> {
public getById(addonId: string, clientType: WowClientType): Observable<AddonSearchResult> {
return from(this._circuitBreaker.fire(addonId)).pipe(
map((result) => (result ? this.toAddonSearchResult(result, "") : undefined))
);
}
isValidAddonUri(addonUri: URL): boolean {
public isValidAddonUri(addonUri: URL): boolean {
return addonUri.host && addonUri.host.endsWith("wowinterface.com");
}
onPostInstall(addon: Addon): void {
public isValidAddonId(addonId: string): boolean {
return !!addonId && !isNaN(parseInt(addonId, 10));
}
public onPostInstall(addon: Addon): void {
throw new Error("Method not implemented.");
}

View File

@@ -67,6 +67,10 @@ export class WowUpAddonProvider implements AddonProvider {
return false;
}
isValidAddonId(addonId: string): boolean {
return true;
}
onPostInstall(addon: Addon): void {
throw new Error("Method not implemented.");
}

View File

@@ -217,7 +217,7 @@ export class AddonService {
addonId,
onUpdate,
completion,
originalAddon: originalAddon ? { ...originalAddon } : undefined
originalAddon: originalAddon ? { ...originalAddon } : undefined,
});
return promise;
@@ -306,8 +306,9 @@ export class AddonService {
this._addonStorage.set(addon.id, addon);
const actionLabel = `${getEnumName(WowClientType, addon.clientType)}|${addon.providerName}|${addon.externalId}|${addon.name
}`;
const actionLabel = `${getEnumName(WowClientType, addon.clientType)}|${addon.providerName}|${addon.externalId}|${
addon.name
}`;
this._analyticsService.trackAction("install-addon", {
clientType: getEnumName(WowClientType, addon.clientType),
provider: addon.providerName,
@@ -647,21 +648,21 @@ export class AddonService {
}
const externalIds: AddonExternalId[] = [];
if (toc.wowInterfaceId) {
if (this.getProvider(ADDON_PROVIDER_WOWINTERFACE).isValidAddonId(toc.wowInterfaceId)) {
externalIds.push({
id: toc.wowInterfaceId,
providerName: ADDON_PROVIDER_WOWINTERFACE,
});
}
if (toc.tukUiProjectId) {
if (this.getProvider(ADDON_PROVIDER_TUKUI).isValidAddonId(toc.tukUiProjectId)) {
externalIds.push({
id: toc.tukUiProjectId,
providerName: ADDON_PROVIDER_TUKUI,
});
}
if (toc.curseProjectId) {
if (this.getProvider(ADDON_PROVIDER_CURSEFORGE).isValidAddonId(toc.curseProjectId)) {
externalIds.push({
id: toc.curseProjectId,
providerName: ADDON_PROVIDER_CURSEFORGE,
@@ -672,7 +673,7 @@ export class AddonService {
if (!this.containsOwnExternalId(addon, externalIds)) {
externalIds.push({
id: addon.externalId,
providerName: addon.providerName
providerName: addon.providerName,
});
}
@@ -701,14 +702,19 @@ export class AddonService {
return;
}
oldAddon.externalIds.forEach(oldExtId => {
const match = newAddon.externalIds.find(newExtId => newExtId.id === oldExtId.id && newExtId.providerName === oldExtId.providerName);
oldAddon.externalIds.forEach((oldExtId) => {
const match = newAddon.externalIds.find(
(newExtId) => newExtId.id === oldExtId.id && newExtId.providerName === oldExtId.providerName
);
if (match) {
return;
}
console.log(`Reconciling external id: ${oldExtId.providerName}|${oldExtId.id}`);
newAddon.externalIds.push({ ...oldExtId });
})
});
// Remove external ids that are not valid that we may have saved previously
_.remove(newAddon.externalIds, (extId) => !this.getProvider(extId.providerName).isValidAddonId(extId.providerName));
this.saveAddon(newAddon);
}
@@ -761,7 +767,7 @@ export class AddonService {
public containsOwnExternalId(addon: Addon, array?: AddonExternalId[]): boolean {
const arr = array || addon.externalIds;
const result = arr && !!arr.find(ext => ext.id === addon.externalId && ext.providerName === addon.providerName);
const result = arr && !!arr.find((ext) => ext.id === addon.externalId && ext.providerName === addon.providerName);
return result;
}