Improve linear app (#20453)

- Add front component form to create linear issue
<img width="1512" height="831" alt="image"
src="https://github.com/user-attachments/assets/ffbb223f-30a8-4c64-ac6d-002c29b604c1"
/>
<img width="1512" height="829" alt="image"
src="https://github.com/user-attachments/assets/a5ed2464-35a9-4a60-804c-5f15eb0043b4"
/>

- improve marketplace Linear app page
<img width="1302" height="834" alt="image"
src="https://github.com/user-attachments/assets/cdec7ec2-953d-4a49-a797-5369834b03c1"
/>


- update admin settings to display non secret values
<img width="861" height="473" alt="image"
src="https://github.com/user-attachments/assets/41dadf02-aa5d-4eb6-befe-0ad8ad4049b2"
/>
This commit is contained in:
martmull
2026-05-12 16:03:31 +00:00
committed by GitHub
parent 70bb011daa
commit c4e897a7b5
36 changed files with 2145 additions and 436 deletions
@@ -14,6 +14,7 @@ import {
import { type CreateApplicationRegistrationVariableInput } from 'src/engine/core-modules/application/application-registration-variable/dtos/create-application-registration-variable.input';
import { type UpdateApplicationRegistrationVariableInput } from 'src/engine/core-modules/application/application-registration-variable/dtos/update-application-registration-variable.input';
import { SecretEncryptionService } from 'src/engine/core-modules/secret-encryption/secret-encryption.service';
import { ApplicationRegistrationVariableDTO } from 'src/engine/core-modules/application/application-registration-variable/dtos/application-registration-variable.dto';
@Injectable()
export class ApplicationRegistrationVariableService {
@@ -25,19 +26,29 @@ export class ApplicationRegistrationVariableService {
private readonly encryptionService: SecretEncryptionService,
) {}
async findVariables(
async findVariablesWithObfuscatedValues(
applicationRegistrationId: string,
workspaceId: string,
): Promise<ApplicationRegistrationVariableEntity[]> {
): Promise<ApplicationRegistrationVariableDTO[]> {
await this.assertRegistrationOwnedByWorkspace(
applicationRegistrationId,
workspaceId,
);
return this.variableRepository.find({
const variables = await this.variableRepository.find({
where: { applicationRegistrationId },
order: { key: 'ASC' },
});
return variables.map((variable) => ({
...variable,
isFilled: variable.isFilled,
value: variable.isFilled
? variable.isSecret
? '•••••••••••••'
: this.encryptionService.decrypt(variable.encryptedValue)
: null,
}));
}
async createVariable(
@@ -0,0 +1,40 @@
import { Field, ObjectType } from '@nestjs/graphql';
import { UUIDScalarType } from 'src/engine/api/graphql/workspace-schema-builder/graphql-types/scalars';
import { IsBoolean, IsString } from 'class-validator';
import { IDField } from '@ptc-org/nestjs-query-graphql';
@ObjectType()
export class ApplicationRegistrationVariableDTO {
@IDField(() => UUIDScalarType)
id: string;
@IsString()
@Field()
key: string;
@IsString()
@Field(() => String, { nullable: true })
value?: string | null;
@IsString()
@Field()
description: string;
@IsBoolean()
@Field()
isSecret: boolean;
@IsBoolean()
@Field()
isRequired: boolean;
@IsBoolean()
@Field()
isFilled: boolean;
@Field(() => Date)
createdAt: Date;
@Field(() => Date)
updatedAt: Date;
}
@@ -54,6 +54,7 @@ import { PublicEndpointGuard } from 'src/engine/guards/public-endpoint.guard';
import { SettingsPermissionGuard } from 'src/engine/guards/settings-permission.guard';
import { WorkspaceAuthGuard } from 'src/engine/guards/workspace-auth.guard';
import { streamToBuffer } from 'src/utils/stream-to-buffer';
import { ApplicationRegistrationVariableDTO } from 'src/engine/core-modules/application/application-registration-variable/dtos/application-registration-variable.dto';
@UsePipes(ResolverValidationPipe)
@MetadataResolver(() => ApplicationRegistrationEntity)
@@ -186,12 +187,12 @@ export class ApplicationRegistrationResolver {
WorkspaceAuthGuard,
SettingsPermissionGuard(PermissionFlagType.API_KEYS_AND_WEBHOOKS),
)
@Query(() => [ApplicationRegistrationVariableEntity])
@Query(() => [ApplicationRegistrationVariableDTO])
async findApplicationRegistrationVariables(
@Args('applicationRegistrationId') applicationRegistrationId: string,
@AuthWorkspace() { id: workspaceId }: WorkspaceEntity,
): Promise<ApplicationRegistrationVariableEntity[]> {
return this.applicationRegistrationVariableService.findVariables(
): Promise<ApplicationRegistrationVariableDTO[]> {
return this.applicationRegistrationVariableService.findVariablesWithObfuscatedValues(
applicationRegistrationId,
workspaceId,
);