Skip to content

Commit

Permalink
[backend] improve schema and domain methods (#4903)
Browse files Browse the repository at this point in the history
  • Loading branch information
marieflorescontact committed Jan 13, 2024
1 parent a6f4cec commit 782f994
Show file tree
Hide file tree
Showing 9 changed files with 148 additions and 30 deletions.
15 changes: 13 additions & 2 deletions opencti-platform/opencti-front/src/schema/relay.schema.graphql
Original file line number Diff line number Diff line change
Expand Up @@ -7279,6 +7279,7 @@ type Query {
csvMappers(first: Int, after: ID, orderBy: CsvMapperOrdering, orderMode: OrderingMode, filters: FilterGroup, search: String): CsvMapperConnection
csvMapperTest(configuration: String!, content: String!): CsvMapperTestResult
publicDashboard(id: String!): PublicDashboard
publicDashboardPublic(uri_key: String!): PublicDashboard
}

type Subscription {
Expand Down Expand Up @@ -8022,7 +8023,9 @@ type Mutation {
csvMapperAdd(input: CsvMapperAddInput!): CsvMapper
csvMapperDelete(id: ID!): ID
csvMapperFieldPatch(id: ID!, input: [EditInput!]!): CsvMapper
publicDashboardAdd(dashboard_id: String!): PublicDashboard
publicDashboardAdd(input: PublicDashboardAddInput!): PublicDashboard
publicDashboardDelete(id: ID!): ID
publicDashboardFieldPatch(id: ID!, input: [EditInput!]!): PublicDashboard
}

type Channel implements BasicObject & StixObject & StixCoreObject & StixDomainObject {
Expand Down Expand Up @@ -10884,9 +10887,17 @@ type PublicDashboard implements InternalObject & BasicObject {
dashboard_id: String
user_id: String!
public_manifest: String
uri_keys: [String]
private_manifest: String
published_until: DateTime
uri_key: String
max_marking: [MarkingDefinition!]
created_at: DateTime
updated_at: DateTime
editContext: [EditUserContext!]
}

input PublicDashboardAddInput {
name: String!
description: String
dashboard_id: String!
}
6 changes: 6 additions & 0 deletions opencti-platform/opencti-graphql/src/config/conf.js
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ import { ENTITY_TYPE_MANAGER_CONFIGURATION } from '../modules/managerConfigurati
import { ENTITY_TYPE_WORKSPACE } from '../modules/workspace/workspace-types';
import { ENTITY_TYPE_NOTIFIER } from '../modules/notifier/notifier-types';
import { UnknownError, UnsupportedError } from './errors';
import { ENTITY_TYPE_PUBLIC_DASHBOARD } from '../modules/publicDashboard/publicDashboard-types';

// https://golang.org/src/crypto/x509/root_linux.go
const LINUX_CERTFILES = [
Expand Down Expand Up @@ -72,6 +73,11 @@ export const BUS_TOPICS = {
EDIT_TOPIC: `${TOPIC_PREFIX}WORKSPACE_EDIT_TOPIC`,
ADDED_TOPIC: `${TOPIC_PREFIX}WORKSPACE_ADDED_TOPIC`,
},
[ENTITY_TYPE_PUBLIC_DASHBOARD]: {
EDIT_TOPIC: `${TOPIC_PREFIX}PUBLIC_DASHBOARD_EDIT_TOPIC`,
ADDED_TOPIC: `${TOPIC_PREFIX}PUBLIC_DASHBOARD_ADDED_TOPIC`,
DELETE_TOPIC: `${TOPIC_PREFIX}PUBLIC_DASHBOARD_DELETE_TOPIC`,
},
[M.ENTITY_TYPE_LABEL]: {
EDIT_TOPIC: `${TOPIC_PREFIX}LABEL_EDIT_TOPIC`,
ADDED_TOPIC: `${TOPIC_PREFIX}LABEL_ADDED_TOPIC`,
Expand Down
42 changes: 38 additions & 4 deletions opencti-platform/opencti-graphql/src/generated/graphql.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12049,6 +12049,8 @@ export type Mutation = {
positionAdd?: Maybe<Position>;
positionEdit?: Maybe<PositionEditMutations>;
publicDashboardAdd?: Maybe<PublicDashboard>;
publicDashboardDelete?: Maybe<Scalars['ID']['output']>;
publicDashboardFieldPatch?: Maybe<PublicDashboard>;
queryTaskAdd: BackgroundTask;
regionAdd?: Maybe<Region>;
regionEdit?: Maybe<RegionEditMutations>;
Expand Down Expand Up @@ -13224,7 +13226,18 @@ export type MutationPositionEditArgs = {


export type MutationPublicDashboardAddArgs = {
dashboard_id: Scalars['String']['input'];
input: PublicDashboardAddInput;
};


export type MutationPublicDashboardDeleteArgs = {
id: Scalars['ID']['input'];
};


export type MutationPublicDashboardFieldPatchArgs = {
id: Scalars['ID']['input'];
input: Array<EditInput>;
};


Expand Down Expand Up @@ -16885,13 +16898,21 @@ export type PublicDashboard = BasicObject & InternalObject & {
max_marking?: Maybe<Array<MarkingDefinition>>;
name: Scalars['String']['output'];
parent_types: Array<Scalars['String']['output']>;
private_manifest?: Maybe<Scalars['String']['output']>;
public_manifest?: Maybe<Scalars['String']['output']>;
published_until?: Maybe<Scalars['DateTime']['output']>;
standard_id: Scalars['String']['output'];
updated_at?: Maybe<Scalars['DateTime']['output']>;
uri_keys?: Maybe<Array<Maybe<Scalars['String']['output']>>>;
uri_key?: Maybe<Scalars['String']['output']>;
user_id: Scalars['String']['output'];
};

export type PublicDashboardAddInput = {
dashboard_id: Scalars['String']['input'];
description?: InputMaybe<Scalars['String']['input']>;
name: Scalars['String']['input'];
};

export type Query = {
__typename?: 'Query';
about?: Maybe<AppInfo>;
Expand Down Expand Up @@ -17061,6 +17082,7 @@ export type Query = {
position?: Maybe<Position>;
positions?: Maybe<PositionConnection>;
publicDashboard?: Maybe<PublicDashboard>;
publicDashboardPublic?: Maybe<PublicDashboard>;
publicStixCoreObjectsMultiTimeSeries?: Maybe<Array<Maybe<MultiTimeSeries>>>;
rabbitMQMetrics?: Maybe<RabbitMqMetrics>;
region?: Maybe<Region>;
Expand Down Expand Up @@ -18362,6 +18384,11 @@ export type QueryPublicDashboardArgs = {
};


export type QueryPublicDashboardPublicArgs = {
uri_key: Scalars['String']['input'];
};


export type QueryPublicStixCoreObjectsMultiTimeSeriesArgs = {
dashboardId: Scalars['String']['input'];
endDate?: InputMaybe<Scalars['DateTime']['input']>;
Expand Down Expand Up @@ -27640,6 +27667,7 @@ export type ResolversTypes = ResolversObject<{
ProcessAddInput: ProcessAddInput;
Provider: ResolverTypeWrapper<Provider>;
PublicDashboard: ResolverTypeWrapper<BasicStoreEntityPublicDashboard>;
PublicDashboardAddInput: PublicDashboardAddInput;
Query: ResolverTypeWrapper<{}>;
QueryTask: ResolverTypeWrapper<QueryTask>;
QueryTaskAddInput: QueryTaskAddInput;
Expand Down Expand Up @@ -28316,6 +28344,7 @@ export type ResolversParentTypes = ResolversObject<{
ProcessAddInput: ProcessAddInput;
Provider: Provider;
PublicDashboard: BasicStoreEntityPublicDashboard;
PublicDashboardAddInput: PublicDashboardAddInput;
Query: {};
QueryTask: QueryTask;
QueryTaskAddInput: QueryTaskAddInput;
Expand Down Expand Up @@ -32690,7 +32719,9 @@ export type MutationResolvers<ContextType = any, ParentType extends ResolversPar
playbookUpdatePositions?: Resolver<Maybe<ResolversTypes['ID']>, ParentType, ContextType, RequireFields<MutationPlaybookUpdatePositionsArgs, 'id' | 'positions'>>;
positionAdd?: Resolver<Maybe<ResolversTypes['Position']>, ParentType, ContextType, RequireFields<MutationPositionAddArgs, 'input'>>;
positionEdit?: Resolver<Maybe<ResolversTypes['PositionEditMutations']>, ParentType, ContextType, RequireFields<MutationPositionEditArgs, 'id'>>;
publicDashboardAdd?: Resolver<Maybe<ResolversTypes['PublicDashboard']>, ParentType, ContextType, RequireFields<MutationPublicDashboardAddArgs, 'dashboard_id'>>;
publicDashboardAdd?: Resolver<Maybe<ResolversTypes['PublicDashboard']>, ParentType, ContextType, RequireFields<MutationPublicDashboardAddArgs, 'input'>>;
publicDashboardDelete?: Resolver<Maybe<ResolversTypes['ID']>, ParentType, ContextType, RequireFields<MutationPublicDashboardDeleteArgs, 'id'>>;
publicDashboardFieldPatch?: Resolver<Maybe<ResolversTypes['PublicDashboard']>, ParentType, ContextType, RequireFields<MutationPublicDashboardFieldPatchArgs, 'id' | 'input'>>;
queryTaskAdd?: Resolver<ResolversTypes['BackgroundTask'], ParentType, ContextType, RequireFields<MutationQueryTaskAddArgs, 'input'>>;
regionAdd?: Resolver<Maybe<ResolversTypes['Region']>, ParentType, ContextType, RequireFields<MutationRegionAddArgs, 'input'>>;
regionEdit?: Resolver<Maybe<ResolversTypes['RegionEditMutations']>, ParentType, ContextType, RequireFields<MutationRegionEditArgs, 'id'>>;
Expand Down Expand Up @@ -33773,10 +33804,12 @@ export type PublicDashboardResolvers<ContextType = any, ParentType extends Resol
max_marking?: Resolver<Maybe<Array<ResolversTypes['MarkingDefinition']>>, ParentType, ContextType>;
name?: Resolver<ResolversTypes['String'], ParentType, ContextType>;
parent_types?: Resolver<Array<ResolversTypes['String']>, ParentType, ContextType>;
private_manifest?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
public_manifest?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
published_until?: Resolver<Maybe<ResolversTypes['DateTime']>, ParentType, ContextType>;
standard_id?: Resolver<ResolversTypes['String'], ParentType, ContextType>;
updated_at?: Resolver<Maybe<ResolversTypes['DateTime']>, ParentType, ContextType>;
uri_keys?: Resolver<Maybe<Array<Maybe<ResolversTypes['String']>>>, ParentType, ContextType>;
uri_key?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
user_id?: Resolver<ResolversTypes['String'], ParentType, ContextType>;
__isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
}>;
Expand Down Expand Up @@ -33949,6 +33982,7 @@ export type QueryResolvers<ContextType = any, ParentType extends ResolversParent
position?: Resolver<Maybe<ResolversTypes['Position']>, ParentType, ContextType, RequireFields<QueryPositionArgs, 'id'>>;
positions?: Resolver<Maybe<ResolversTypes['PositionConnection']>, ParentType, ContextType, Partial<QueryPositionsArgs>>;
publicDashboard?: Resolver<Maybe<ResolversTypes['PublicDashboard']>, ParentType, ContextType, RequireFields<QueryPublicDashboardArgs, 'id'>>;
publicDashboardPublic?: Resolver<Maybe<ResolversTypes['PublicDashboard']>, ParentType, ContextType, RequireFields<QueryPublicDashboardPublicArgs, 'uri_key'>>;
publicStixCoreObjectsMultiTimeSeries?: Resolver<Maybe<Array<Maybe<ResolversTypes['MultiTimeSeries']>>>, ParentType, ContextType, RequireFields<QueryPublicStixCoreObjectsMultiTimeSeriesArgs, 'dashboardId' | 'interval' | 'startDate' | 'widgetId'>>;
rabbitMQMetrics?: Resolver<Maybe<ResolversTypes['RabbitMQMetrics']>, ParentType, ContextType, Partial<QueryRabbitMqMetricsArgs>>;
region?: Resolver<Maybe<ResolversTypes['Region']>, ParentType, ContextType, RequireFields<QueryRegionArgs, 'id'>>;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,8 @@ const convertPublicDashboardToStix = (instance: StoreEntityPublicDashboard): Sti
dashboard_id: instance.dashboard_id,
user_id: instance.user_id,
public_manifest: instance.public_manifest,
uri_keys: instance.uri_keys,
private_manifest: instance.private_manifest,
uri_key: instance.uri_key,
aliases: instance.x_opencti_aliases ?? [],
extensions: {
[STIX_EXT_OCTI]: cleanObject({
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
import { v4 as uuidv4 } from 'uuid';
import type { AuthContext, AuthUser } from '../../types/user';
import { storeLoadById } from '../../database/middleware-loader';
import { ENTITY_TYPE_PUBLIC_DASHBOARD, type BasicStoreEntityPublicDashboard } from './publicDashboard-types';
import { createEntity } from '../../database/middleware';
import { createEntity, deleteElementById, updateAttribute } from '../../database/middleware';
import { type BasicStoreEntityWorkspace, ENTITY_TYPE_WORKSPACE } from '../workspace/workspace-types';
import { fromBase64, toBase64 } from '../../database/utils';
import { notify } from '../../database/redis';
import { BUS_TOPICS } from '../../config/conf';
import type { EditInput, PublicDashboardAddInput } from '../../generated/graphql';

export const findById = (
context: AuthContext,
Expand All @@ -20,16 +22,24 @@ export const findById = (
);
};

export const publicDashboardPublic = async (
context: AuthContext,
user: AuthUser,
uri_key: string,
) => {
return await storeLoadById(context, user, uri_key, ENTITY_TYPE_PUBLIC_DASHBOARD) as unknown as BasicStoreEntityPublicDashboard;
};

export const addPublicDashboard = async (
context: AuthContext,
user: AuthUser,
dashboard_id: string,
input: PublicDashboardAddInput,
) => {
// Get private dashboard manifest
const dashboard: BasicStoreEntityWorkspace = await storeLoadById(
context,
user,
dashboard_id,
input.dashboard_id,
ENTITY_TYPE_WORKSPACE,
);
const parsedManifest = JSON.parse(fromBase64(dashboard.manifest) ?? '{}');
Expand All @@ -41,14 +51,48 @@ export const addPublicDashboard = async (

// Create public manifest
const publicManifest = toBase64(JSON.stringify(parsedManifest));
const publicDashboardToCreate = { public_manifest: publicManifest };

// Create publicDashboard
const publicDashboardToCreate = { // TODO add marking max
name: input.dashboard_id,
description: input.description,

Check warning on line 58 in opencti-platform/opencti-graphql/src/modules/publicDashboard/publicDashboard-domain.ts

View check run for this annotation

Codecov / codecov/patch

opencti-platform/opencti-graphql/src/modules/publicDashboard/publicDashboard-domain.ts#L50-L58

Added lines #L50 - L58 were not covered by tests
public_manifest: publicManifest,
private_manifest: dashboard.manifest,
user_id: user.id,
uri_key: uuidv4(),
};

const created = await createEntity(
context,
user,

Check warning on line 67 in opencti-platform/opencti-graphql/src/modules/publicDashboard/publicDashboard-domain.ts

View check run for this annotation

Codecov / codecov/patch

opencti-platform/opencti-graphql/src/modules/publicDashboard/publicDashboard-domain.ts#L60-L67

Added lines #L60 - L67 were not covered by tests
publicDashboardToCreate,
ENTITY_TYPE_PUBLIC_DASHBOARD,
);
return notify(BUS_TOPICS[ENTITY_TYPE_WORKSPACE].ADDED_TOPIC, created, user);
return notify(BUS_TOPICS[ENTITY_TYPE_PUBLIC_DASHBOARD].ADDED_TOPIC, created, user);
};

export const publicDashboardEditField = async (
context: AuthContext,
user: AuthUser,
id: string,
input: EditInput[],
) => {
const { element } = await updateAttribute(
context,
user,
id,
ENTITY_TYPE_PUBLIC_DASHBOARD,
input,
);
return notify(BUS_TOPICS[ENTITY_TYPE_PUBLIC_DASHBOARD].EDIT_TOPIC, element, user);
};

export const publicDashboardDelete = async (context: AuthContext, user: AuthUser, id: string) => {
const element = await deleteElementById(
context,
user,
id,
ENTITY_TYPE_PUBLIC_DASHBOARD
);
return notify(BUS_TOPICS[ENTITY_TYPE_PUBLIC_DASHBOARD].DELETE_TOPIC, element, user).then(() => id);
};
Original file line number Diff line number Diff line change
@@ -1,13 +1,20 @@
import type { Resolvers } from '../../generated/graphql';
import { addPublicDashboard, findById } from './publicDashboard-domain';
import { addPublicDashboard, findById, publicDashboardDelete, publicDashboardEditField, publicDashboardPublic } from './publicDashboard-domain';

const publicDashboardResolvers: Resolvers = {
Query: {
publicDashboard: (_, { id }, context) => findById(context, context.user, id),
publicDashboardPublic: (_, { uri_key }, context) => publicDashboardPublic(context, context.user, uri_key),
},
Mutation: {

Check warning on line 9 in opencti-platform/opencti-graphql/src/modules/publicDashboard/publicDashboard-resolvers.ts

View check run for this annotation

Codecov / codecov/patch

opencti-platform/opencti-graphql/src/modules/publicDashboard/publicDashboard-resolvers.ts#L9

Added line #L9 was not covered by tests
publicDashboardAdd: (_, { dashboard_id }, context) => {
return addPublicDashboard(context, context.user, dashboard_id);
publicDashboardAdd: (_, { input }, context) => {
return addPublicDashboard(context, context.user, input);
},

Check warning on line 12 in opencti-platform/opencti-graphql/src/modules/publicDashboard/publicDashboard-resolvers.ts

View check run for this annotation

Codecov / codecov/patch

opencti-platform/opencti-graphql/src/modules/publicDashboard/publicDashboard-resolvers.ts#L12

Added line #L12 was not covered by tests
publicDashboardDelete: (_, { id }, context) => {
return publicDashboardDelete(context, context.user, id);
},

Check warning on line 15 in opencti-platform/opencti-graphql/src/modules/publicDashboard/publicDashboard-resolvers.ts

View check run for this annotation

Codecov / codecov/patch

opencti-platform/opencti-graphql/src/modules/publicDashboard/publicDashboard-resolvers.ts#L15

Added line #L15 was not covered by tests
publicDashboardFieldPatch: (_, { id, input }, context) => {
return publicDashboardEditField(context, context.user, id, input);
},
},
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,8 @@ export interface BasicStoreEntityPublicDashboard extends BasicStoreEntity {
dashboard_id: string;
user_id: string;
public_manifest: string;
uri_keys: Array<string>;
private_manifest: string;
uri_key: string;
}

export interface StoreEntityPublicDashboard extends StoreEntity {
Expand All @@ -20,7 +21,8 @@ export interface StoreEntityPublicDashboard extends StoreEntity {
dashboard_id: string;
user_id: string;
public_manifest: string;
uri_keys: Array<string>;
private_manifest: string;
uri_key: string;
}
// endregion

Expand All @@ -31,7 +33,8 @@ export interface StixPublicDashboard extends StixDomainObject {
dashboard_id: string;
user_id: string;
public_manifest: string;
uri_keys: Array<string>;
private_manifest: string;
uri_key: string;
aliases: Array<string>;
extensions: {
[STIX_EXT_OCTI] : StixOpenctiExtensionSDO
Expand Down
Original file line number Diff line number Diff line change
@@ -1,28 +1,39 @@
type PublicDashboard implements InternalObject & BasicObject {
id: ID!
entity_type: String!
standard_id: String!
parent_types: [String!]!
id: ID! @auth(for: [KNOWLEDGE, EXPLORE])
entity_type: String! @auth(for: [KNOWLEDGE, EXPLORE])
standard_id: String! @auth(for: [KNOWLEDGE, EXPLORE])
parent_types: [String!]! @auth(for: [KNOWLEDGE, EXPLORE])
# PublicDashboard
name: String!
description: String
dashboard_id: String
user_id: String!
dashboard_id: String @auth(for: [KNOWLEDGE, EXPLORE])
user_id: String! @auth(for: [KNOWLEDGE, EXPLORE])
public_manifest: String
uri_keys: [String]
max_marking: [MarkingDefinition!]
private_manifest: String @auth(for: [KNOWLEDGE, EXPLORE])
published_until: DateTime
uri_key: String @auth(for: [KNOWLEDGE, EXPLORE])
max_marking: [MarkingDefinition!] @auth(for: [KNOWLEDGE, EXPLORE])
created_at: DateTime
updated_at: DateTime
editContext: [EditUserContext!]
editContext: [EditUserContext!] @auth(for: [KNOWLEDGE, EXPLORE])
}

# Queries
type Query {
publicDashboard(id: String!): PublicDashboard @auth
publicDashboard(id: String!): PublicDashboard @auth(for: [KNOWLEDGE, EXPLORE])
publicDashboardPublic(uri_key: String!): PublicDashboard
}

# Mutation
input PublicDashboardAddInput {
name: String!
description: String
dashboard_id: String!
}

type Mutation {
publicDashboardAdd(dashboard_id: String!): PublicDashboard @auth(for: [KNOWLEDGE, EXPLORE])
publicDashboardAdd(input: PublicDashboardAddInput!): PublicDashboard @auth(for: [EXPLORE_EXUPDATE_PUBLISH])
publicDashboardDelete(id: ID!): ID @auth(for: [EXPLORE_EXUPDATE_PUBLISH])
publicDashboardFieldPatch(id: ID!, input: [EditInput!]!): PublicDashboard @auth(for: [EXPLORE_EXUPDATE_PUBLISH])
}

Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,8 @@ export const PUBLIC_DASHBOARD_DEFINITION: ModuleDefinition<StoreEntityPublicDash
{ name: 'description', label: 'Description', type: 'string', format: 'short', mandatoryType: 'no', editDefault: false, multiple: false, upsert: true, isFilterable: true },
{ name: 'dashboard_id', label: 'Dashboard id', type: 'string', format: 'short', mandatoryType: 'internal', editDefault: false, multiple: false, upsert: true, isFilterable: false },
{ name: 'public_manifest', label: 'Public manifest', type: 'string', format: 'short', mandatoryType: 'internal', editDefault: false, multiple: false, upsert: false, isFilterable: false },
{ name: 'uri_keys', label: 'Uri', type: 'string', format: 'short', mandatoryType: 'no', editDefault: false, multiple: false, upsert: false, isFilterable: false },
{ name: 'private_manifest', label: 'Public manifest', type: 'string', format: 'short', mandatoryType: 'internal', editDefault: false, multiple: false, upsert: false, isFilterable: false },
{ name: 'uri_key', label: 'Uri key', type: 'string', format: 'short', mandatoryType: 'no', editDefault: false, multiple: false, upsert: false, isFilterable: false },
],
relations: [],

Check warning on line 28 in opencti-platform/opencti-graphql/src/modules/publicDashboard/publicDashboard.ts

View check run for this annotation

Codecov / codecov/patch

opencti-platform/opencti-graphql/src/modules/publicDashboard/publicDashboard.ts#L28

Added line #L28 was not covered by tests
representative: (stix: StixPublicDashboard) => {
Expand Down

0 comments on commit 782f994

Please sign in to comment.