diff --git a/back/loaders/db.ts b/back/loaders/db.ts index 999ab43b..8c177b0d 100644 --- a/back/loaders/db.ts +++ b/back/loaders/db.ts @@ -48,16 +48,18 @@ export default async () => { } catch (error) {} try { await sequelize.query('alter table Crontabs add column sub_id NUMBER'); - } catch (error) { } + } catch (error) {} try { - await sequelize.query('alter table Crontabs add column extra_schedules JSON'); - } catch (error) { } + await sequelize.query( + 'alter table Crontabs add column extra_schedules JSON', + ); + } catch (error) {} try { await sequelize.query('alter table Crontabs add column task_before TEXT'); - } catch (error) { } + } catch (error) {} try { await sequelize.query('alter table Crontabs add column task_after TEXT'); - } catch (error) { } + } catch (error) {} // 2.10-2.11 升级 const cronDbFile = path.join(config.rootPath, 'db/crontab.db'); diff --git a/back/loaders/initData.ts b/back/loaders/initData.ts index 1051220d..0320e409 100644 --- a/back/loaders/initData.ts +++ b/back/loaders/initData.ts @@ -13,10 +13,11 @@ import { AuthDataType, SystemModel } from '../data/system'; import SystemService from '../services/system'; import UserService from '../services/user'; import { writeFile, readFile } from 'fs/promises'; -import { safeJSONParse } from '../config/util'; +import { createRandomString, safeJSONParse } from '../config/util'; import OpenService from '../services/open'; import { shareStore } from '../shared/store'; import Logger from './logger'; +import { AppModel } from '../data/open'; export default async () => { const cronService = Container.get(CronService); @@ -27,6 +28,19 @@ export default async () => { const openService = Container.get(OpenService); // 初始化增加系统配置 + let systemApp = ( + await AppModel.findOne({ + where: { name: 'system' }, + }) + )?.get({ plain: true }); + if (!systemApp) { + systemApp = await AppModel.create({ + name: 'system', + scopes: ['crons', 'system'], + client_id: createRandomString(12, 12), + client_secret: createRandomString(24, 24), + }); + } const [systemConfig] = await SystemModel.findOrCreate({ where: { type: AuthDataType.systemConfig }, }); diff --git a/back/protos/api.proto b/back/protos/api.proto new file mode 100644 index 00000000..017b0f10 --- /dev/null +++ b/back/protos/api.proto @@ -0,0 +1,73 @@ +syntax = "proto3"; + +package com.ql.api; + +message EnvItem { + optional int32 id = 1; + optional string name = 2; + optional string value = 3; + optional string remarks = 4; + optional int32 status = 5; + optional int32 position = 6; +} + +message GetEnvsRequest { string searchValue = 1; } + +message CreateEnvRequest { repeated EnvItem envs = 1; } + +message UpdateEnvRequest { EnvItem env = 1; } + +message DeleteEnvsRequest { repeated int32 ids = 1; } + +message MoveEnvRequest { + int32 id = 1; + int32 fromIndex = 2; + int32 toIndex = 3; +} + +message DisableEnvsRequest { repeated int32 ids = 1; } + +message EnableEnvsRequest { repeated int32 ids = 1; } + +message UpdateEnvNamesRequest { + repeated int32 ids = 1; + string name = 2; +} + +message GetEnvByIdRequest { int32 id = 1; } + +message EnvsResponse { + int32 code = 1; + repeated EnvItem data = 2; + optional string message = 3; +} + +message EnvResponse { + int32 code = 1; + EnvItem data = 2; + optional string message = 3; +} + +message Response { + int32 code = 1; + optional string message = 2; +} + +message SystemNotifyRequest { + string title = 1; + string content = 2; +} +message SystemNotifyResponse {} + +service Api { + rpc GetEnvs(GetEnvsRequest) returns (EnvsResponse) {} + rpc CreateEnv(CreateEnvRequest) returns (EnvsResponse) {} + rpc UpdateEnv(UpdateEnvRequest) returns (EnvResponse) {} + rpc DeleteEnvs(DeleteEnvsRequest) returns (Response) {} + rpc MoveEnv(MoveEnvRequest) returns (EnvResponse) {} + rpc DisableEnvs(DisableEnvsRequest) returns (Response) {} + rpc EnableEnvs(EnableEnvsRequest) returns (Response) {} + rpc UpdateEnvNames(UpdateEnvNamesRequest) returns (Response) {} + rpc GetEnvById(GetEnvByIdRequest) returns (EnvResponse) {} + rpc SystemNotify(SystemNotifyRequest) returns (SystemNotifyResponse) {} +} \ No newline at end of file diff --git a/back/protos/api.ts b/back/protos/api.ts new file mode 100644 index 00000000..596788ca --- /dev/null +++ b/back/protos/api.ts @@ -0,0 +1,1497 @@ +// Code generated by protoc-gen-ts_proto. DO NOT EDIT. +// versions: +// protoc-gen-ts_proto v1.181.2 +// protoc v3.17.3 +// source: back/protos/api.proto + +/* eslint-disable */ +import { + type CallOptions, + ChannelCredentials, + Client, + type ClientOptions, + type ClientUnaryCall, + type handleUnaryCall, + makeGenericClientConstructor, + Metadata, + type ServiceError, + type UntypedServiceImplementation, +} from "@grpc/grpc-js"; +import _m0 from "protobufjs/minimal"; + +export const protobufPackage = "com.ql.api"; + +export interface EnvItem { + id?: number | undefined; + name?: string | undefined; + value?: string | undefined; + remarks?: string | undefined; + status?: number | undefined; + position?: number | undefined; +} + +export interface GetEnvsRequest { + searchValue: string; +} + +export interface CreateEnvRequest { + envs: EnvItem[]; +} + +export interface UpdateEnvRequest { + env: EnvItem | undefined; +} + +export interface DeleteEnvsRequest { + ids: number[]; +} + +export interface MoveEnvRequest { + id: number; + fromIndex: number; + toIndex: number; +} + +export interface DisableEnvsRequest { + ids: number[]; +} + +export interface EnableEnvsRequest { + ids: number[]; +} + +export interface UpdateEnvNamesRequest { + ids: number[]; + name: string; +} + +export interface GetEnvByIdRequest { + id: number; +} + +export interface EnvsResponse { + code: number; + data: EnvItem[]; + message?: string | undefined; +} + +export interface EnvResponse { + code: number; + data: EnvItem | undefined; + message?: string | undefined; +} + +export interface Response { + code: number; + message?: string | undefined; +} + +export interface SystemNotifyRequest { + title: string; + content: string; +} + +export interface SystemNotifyResponse { +} + +function createBaseEnvItem(): EnvItem { + return { + id: undefined, + name: undefined, + value: undefined, + remarks: undefined, + status: undefined, + position: undefined, + }; +} + +export const EnvItem = { + encode(message: EnvItem, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.id !== undefined) { + writer.uint32(8).int32(message.id); + } + if (message.name !== undefined) { + writer.uint32(18).string(message.name); + } + if (message.value !== undefined) { + writer.uint32(26).string(message.value); + } + if (message.remarks !== undefined) { + writer.uint32(34).string(message.remarks); + } + if (message.status !== undefined) { + writer.uint32(40).int32(message.status); + } + if (message.position !== undefined) { + writer.uint32(48).int32(message.position); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): EnvItem { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseEnvItem(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 8) { + break; + } + + message.id = reader.int32(); + continue; + case 2: + if (tag !== 18) { + break; + } + + message.name = reader.string(); + continue; + case 3: + if (tag !== 26) { + break; + } + + message.value = reader.string(); + continue; + case 4: + if (tag !== 34) { + break; + } + + message.remarks = reader.string(); + continue; + case 5: + if (tag !== 40) { + break; + } + + message.status = reader.int32(); + continue; + case 6: + if (tag !== 48) { + break; + } + + message.position = reader.int32(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): EnvItem { + return { + id: isSet(object.id) ? globalThis.Number(object.id) : undefined, + name: isSet(object.name) ? globalThis.String(object.name) : undefined, + value: isSet(object.value) ? globalThis.String(object.value) : undefined, + remarks: isSet(object.remarks) ? globalThis.String(object.remarks) : undefined, + status: isSet(object.status) ? globalThis.Number(object.status) : undefined, + position: isSet(object.position) ? globalThis.Number(object.position) : undefined, + }; + }, + + toJSON(message: EnvItem): unknown { + const obj: any = {}; + if (message.id !== undefined) { + obj.id = Math.round(message.id); + } + if (message.name !== undefined) { + obj.name = message.name; + } + if (message.value !== undefined) { + obj.value = message.value; + } + if (message.remarks !== undefined) { + obj.remarks = message.remarks; + } + if (message.status !== undefined) { + obj.status = Math.round(message.status); + } + if (message.position !== undefined) { + obj.position = Math.round(message.position); + } + return obj; + }, + + create, I>>(base?: I): EnvItem { + return EnvItem.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): EnvItem { + const message = createBaseEnvItem(); + message.id = object.id ?? undefined; + message.name = object.name ?? undefined; + message.value = object.value ?? undefined; + message.remarks = object.remarks ?? undefined; + message.status = object.status ?? undefined; + message.position = object.position ?? undefined; + return message; + }, +}; + +function createBaseGetEnvsRequest(): GetEnvsRequest { + return { searchValue: "" }; +} + +export const GetEnvsRequest = { + encode(message: GetEnvsRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.searchValue !== "") { + writer.uint32(10).string(message.searchValue); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): GetEnvsRequest { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseGetEnvsRequest(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + + message.searchValue = reader.string(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): GetEnvsRequest { + return { searchValue: isSet(object.searchValue) ? globalThis.String(object.searchValue) : "" }; + }, + + toJSON(message: GetEnvsRequest): unknown { + const obj: any = {}; + if (message.searchValue !== "") { + obj.searchValue = message.searchValue; + } + return obj; + }, + + create, I>>(base?: I): GetEnvsRequest { + return GetEnvsRequest.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): GetEnvsRequest { + const message = createBaseGetEnvsRequest(); + message.searchValue = object.searchValue ?? ""; + return message; + }, +}; + +function createBaseCreateEnvRequest(): CreateEnvRequest { + return { envs: [] }; +} + +export const CreateEnvRequest = { + encode(message: CreateEnvRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + for (const v of message.envs) { + EnvItem.encode(v!, writer.uint32(10).fork()).ldelim(); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): CreateEnvRequest { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseCreateEnvRequest(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + + message.envs.push(EnvItem.decode(reader, reader.uint32())); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): CreateEnvRequest { + return { envs: globalThis.Array.isArray(object?.envs) ? object.envs.map((e: any) => EnvItem.fromJSON(e)) : [] }; + }, + + toJSON(message: CreateEnvRequest): unknown { + const obj: any = {}; + if (message.envs?.length) { + obj.envs = message.envs.map((e) => EnvItem.toJSON(e)); + } + return obj; + }, + + create, I>>(base?: I): CreateEnvRequest { + return CreateEnvRequest.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): CreateEnvRequest { + const message = createBaseCreateEnvRequest(); + message.envs = object.envs?.map((e) => EnvItem.fromPartial(e)) || []; + return message; + }, +}; + +function createBaseUpdateEnvRequest(): UpdateEnvRequest { + return { env: undefined }; +} + +export const UpdateEnvRequest = { + encode(message: UpdateEnvRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.env !== undefined) { + EnvItem.encode(message.env, writer.uint32(10).fork()).ldelim(); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): UpdateEnvRequest { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseUpdateEnvRequest(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + + message.env = EnvItem.decode(reader, reader.uint32()); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): UpdateEnvRequest { + return { env: isSet(object.env) ? EnvItem.fromJSON(object.env) : undefined }; + }, + + toJSON(message: UpdateEnvRequest): unknown { + const obj: any = {}; + if (message.env !== undefined) { + obj.env = EnvItem.toJSON(message.env); + } + return obj; + }, + + create, I>>(base?: I): UpdateEnvRequest { + return UpdateEnvRequest.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): UpdateEnvRequest { + const message = createBaseUpdateEnvRequest(); + message.env = (object.env !== undefined && object.env !== null) ? EnvItem.fromPartial(object.env) : undefined; + return message; + }, +}; + +function createBaseDeleteEnvsRequest(): DeleteEnvsRequest { + return { ids: [] }; +} + +export const DeleteEnvsRequest = { + encode(message: DeleteEnvsRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + writer.uint32(10).fork(); + for (const v of message.ids) { + writer.int32(v); + } + writer.ldelim(); + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): DeleteEnvsRequest { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseDeleteEnvsRequest(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag === 8) { + message.ids.push(reader.int32()); + + continue; + } + + if (tag === 10) { + const end2 = reader.uint32() + reader.pos; + while (reader.pos < end2) { + message.ids.push(reader.int32()); + } + + continue; + } + + break; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): DeleteEnvsRequest { + return { ids: globalThis.Array.isArray(object?.ids) ? object.ids.map((e: any) => globalThis.Number(e)) : [] }; + }, + + toJSON(message: DeleteEnvsRequest): unknown { + const obj: any = {}; + if (message.ids?.length) { + obj.ids = message.ids.map((e) => Math.round(e)); + } + return obj; + }, + + create, I>>(base?: I): DeleteEnvsRequest { + return DeleteEnvsRequest.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): DeleteEnvsRequest { + const message = createBaseDeleteEnvsRequest(); + message.ids = object.ids?.map((e) => e) || []; + return message; + }, +}; + +function createBaseMoveEnvRequest(): MoveEnvRequest { + return { id: 0, fromIndex: 0, toIndex: 0 }; +} + +export const MoveEnvRequest = { + encode(message: MoveEnvRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.id !== 0) { + writer.uint32(8).int32(message.id); + } + if (message.fromIndex !== 0) { + writer.uint32(16).int32(message.fromIndex); + } + if (message.toIndex !== 0) { + writer.uint32(24).int32(message.toIndex); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): MoveEnvRequest { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseMoveEnvRequest(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 8) { + break; + } + + message.id = reader.int32(); + continue; + case 2: + if (tag !== 16) { + break; + } + + message.fromIndex = reader.int32(); + continue; + case 3: + if (tag !== 24) { + break; + } + + message.toIndex = reader.int32(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): MoveEnvRequest { + return { + id: isSet(object.id) ? globalThis.Number(object.id) : 0, + fromIndex: isSet(object.fromIndex) ? globalThis.Number(object.fromIndex) : 0, + toIndex: isSet(object.toIndex) ? globalThis.Number(object.toIndex) : 0, + }; + }, + + toJSON(message: MoveEnvRequest): unknown { + const obj: any = {}; + if (message.id !== 0) { + obj.id = Math.round(message.id); + } + if (message.fromIndex !== 0) { + obj.fromIndex = Math.round(message.fromIndex); + } + if (message.toIndex !== 0) { + obj.toIndex = Math.round(message.toIndex); + } + return obj; + }, + + create, I>>(base?: I): MoveEnvRequest { + return MoveEnvRequest.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): MoveEnvRequest { + const message = createBaseMoveEnvRequest(); + message.id = object.id ?? 0; + message.fromIndex = object.fromIndex ?? 0; + message.toIndex = object.toIndex ?? 0; + return message; + }, +}; + +function createBaseDisableEnvsRequest(): DisableEnvsRequest { + return { ids: [] }; +} + +export const DisableEnvsRequest = { + encode(message: DisableEnvsRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + writer.uint32(10).fork(); + for (const v of message.ids) { + writer.int32(v); + } + writer.ldelim(); + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): DisableEnvsRequest { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseDisableEnvsRequest(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag === 8) { + message.ids.push(reader.int32()); + + continue; + } + + if (tag === 10) { + const end2 = reader.uint32() + reader.pos; + while (reader.pos < end2) { + message.ids.push(reader.int32()); + } + + continue; + } + + break; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): DisableEnvsRequest { + return { ids: globalThis.Array.isArray(object?.ids) ? object.ids.map((e: any) => globalThis.Number(e)) : [] }; + }, + + toJSON(message: DisableEnvsRequest): unknown { + const obj: any = {}; + if (message.ids?.length) { + obj.ids = message.ids.map((e) => Math.round(e)); + } + return obj; + }, + + create, I>>(base?: I): DisableEnvsRequest { + return DisableEnvsRequest.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): DisableEnvsRequest { + const message = createBaseDisableEnvsRequest(); + message.ids = object.ids?.map((e) => e) || []; + return message; + }, +}; + +function createBaseEnableEnvsRequest(): EnableEnvsRequest { + return { ids: [] }; +} + +export const EnableEnvsRequest = { + encode(message: EnableEnvsRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + writer.uint32(10).fork(); + for (const v of message.ids) { + writer.int32(v); + } + writer.ldelim(); + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): EnableEnvsRequest { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseEnableEnvsRequest(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag === 8) { + message.ids.push(reader.int32()); + + continue; + } + + if (tag === 10) { + const end2 = reader.uint32() + reader.pos; + while (reader.pos < end2) { + message.ids.push(reader.int32()); + } + + continue; + } + + break; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): EnableEnvsRequest { + return { ids: globalThis.Array.isArray(object?.ids) ? object.ids.map((e: any) => globalThis.Number(e)) : [] }; + }, + + toJSON(message: EnableEnvsRequest): unknown { + const obj: any = {}; + if (message.ids?.length) { + obj.ids = message.ids.map((e) => Math.round(e)); + } + return obj; + }, + + create, I>>(base?: I): EnableEnvsRequest { + return EnableEnvsRequest.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): EnableEnvsRequest { + const message = createBaseEnableEnvsRequest(); + message.ids = object.ids?.map((e) => e) || []; + return message; + }, +}; + +function createBaseUpdateEnvNamesRequest(): UpdateEnvNamesRequest { + return { ids: [], name: "" }; +} + +export const UpdateEnvNamesRequest = { + encode(message: UpdateEnvNamesRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + writer.uint32(10).fork(); + for (const v of message.ids) { + writer.int32(v); + } + writer.ldelim(); + if (message.name !== "") { + writer.uint32(18).string(message.name); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): UpdateEnvNamesRequest { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseUpdateEnvNamesRequest(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag === 8) { + message.ids.push(reader.int32()); + + continue; + } + + if (tag === 10) { + const end2 = reader.uint32() + reader.pos; + while (reader.pos < end2) { + message.ids.push(reader.int32()); + } + + continue; + } + + break; + case 2: + if (tag !== 18) { + break; + } + + message.name = reader.string(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): UpdateEnvNamesRequest { + return { + ids: globalThis.Array.isArray(object?.ids) ? object.ids.map((e: any) => globalThis.Number(e)) : [], + name: isSet(object.name) ? globalThis.String(object.name) : "", + }; + }, + + toJSON(message: UpdateEnvNamesRequest): unknown { + const obj: any = {}; + if (message.ids?.length) { + obj.ids = message.ids.map((e) => Math.round(e)); + } + if (message.name !== "") { + obj.name = message.name; + } + return obj; + }, + + create, I>>(base?: I): UpdateEnvNamesRequest { + return UpdateEnvNamesRequest.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): UpdateEnvNamesRequest { + const message = createBaseUpdateEnvNamesRequest(); + message.ids = object.ids?.map((e) => e) || []; + message.name = object.name ?? ""; + return message; + }, +}; + +function createBaseGetEnvByIdRequest(): GetEnvByIdRequest { + return { id: 0 }; +} + +export const GetEnvByIdRequest = { + encode(message: GetEnvByIdRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.id !== 0) { + writer.uint32(8).int32(message.id); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): GetEnvByIdRequest { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseGetEnvByIdRequest(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 8) { + break; + } + + message.id = reader.int32(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): GetEnvByIdRequest { + return { id: isSet(object.id) ? globalThis.Number(object.id) : 0 }; + }, + + toJSON(message: GetEnvByIdRequest): unknown { + const obj: any = {}; + if (message.id !== 0) { + obj.id = Math.round(message.id); + } + return obj; + }, + + create, I>>(base?: I): GetEnvByIdRequest { + return GetEnvByIdRequest.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): GetEnvByIdRequest { + const message = createBaseGetEnvByIdRequest(); + message.id = object.id ?? 0; + return message; + }, +}; + +function createBaseEnvsResponse(): EnvsResponse { + return { code: 0, data: [], message: undefined }; +} + +export const EnvsResponse = { + encode(message: EnvsResponse, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.code !== 0) { + writer.uint32(8).int32(message.code); + } + for (const v of message.data) { + EnvItem.encode(v!, writer.uint32(18).fork()).ldelim(); + } + if (message.message !== undefined) { + writer.uint32(26).string(message.message); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): EnvsResponse { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseEnvsResponse(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 8) { + break; + } + + message.code = reader.int32(); + continue; + case 2: + if (tag !== 18) { + break; + } + + message.data.push(EnvItem.decode(reader, reader.uint32())); + continue; + case 3: + if (tag !== 26) { + break; + } + + message.message = reader.string(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): EnvsResponse { + return { + code: isSet(object.code) ? globalThis.Number(object.code) : 0, + data: globalThis.Array.isArray(object?.data) ? object.data.map((e: any) => EnvItem.fromJSON(e)) : [], + message: isSet(object.message) ? globalThis.String(object.message) : undefined, + }; + }, + + toJSON(message: EnvsResponse): unknown { + const obj: any = {}; + if (message.code !== 0) { + obj.code = Math.round(message.code); + } + if (message.data?.length) { + obj.data = message.data.map((e) => EnvItem.toJSON(e)); + } + if (message.message !== undefined) { + obj.message = message.message; + } + return obj; + }, + + create, I>>(base?: I): EnvsResponse { + return EnvsResponse.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): EnvsResponse { + const message = createBaseEnvsResponse(); + message.code = object.code ?? 0; + message.data = object.data?.map((e) => EnvItem.fromPartial(e)) || []; + message.message = object.message ?? undefined; + return message; + }, +}; + +function createBaseEnvResponse(): EnvResponse { + return { code: 0, data: undefined, message: undefined }; +} + +export const EnvResponse = { + encode(message: EnvResponse, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.code !== 0) { + writer.uint32(8).int32(message.code); + } + if (message.data !== undefined) { + EnvItem.encode(message.data, writer.uint32(18).fork()).ldelim(); + } + if (message.message !== undefined) { + writer.uint32(26).string(message.message); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): EnvResponse { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseEnvResponse(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 8) { + break; + } + + message.code = reader.int32(); + continue; + case 2: + if (tag !== 18) { + break; + } + + message.data = EnvItem.decode(reader, reader.uint32()); + continue; + case 3: + if (tag !== 26) { + break; + } + + message.message = reader.string(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): EnvResponse { + return { + code: isSet(object.code) ? globalThis.Number(object.code) : 0, + data: isSet(object.data) ? EnvItem.fromJSON(object.data) : undefined, + message: isSet(object.message) ? globalThis.String(object.message) : undefined, + }; + }, + + toJSON(message: EnvResponse): unknown { + const obj: any = {}; + if (message.code !== 0) { + obj.code = Math.round(message.code); + } + if (message.data !== undefined) { + obj.data = EnvItem.toJSON(message.data); + } + if (message.message !== undefined) { + obj.message = message.message; + } + return obj; + }, + + create, I>>(base?: I): EnvResponse { + return EnvResponse.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): EnvResponse { + const message = createBaseEnvResponse(); + message.code = object.code ?? 0; + message.data = (object.data !== undefined && object.data !== null) ? EnvItem.fromPartial(object.data) : undefined; + message.message = object.message ?? undefined; + return message; + }, +}; + +function createBaseResponse(): Response { + return { code: 0, message: undefined }; +} + +export const Response = { + encode(message: Response, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.code !== 0) { + writer.uint32(8).int32(message.code); + } + if (message.message !== undefined) { + writer.uint32(18).string(message.message); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): Response { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseResponse(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 8) { + break; + } + + message.code = reader.int32(); + continue; + case 2: + if (tag !== 18) { + break; + } + + message.message = reader.string(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): Response { + return { + code: isSet(object.code) ? globalThis.Number(object.code) : 0, + message: isSet(object.message) ? globalThis.String(object.message) : undefined, + }; + }, + + toJSON(message: Response): unknown { + const obj: any = {}; + if (message.code !== 0) { + obj.code = Math.round(message.code); + } + if (message.message !== undefined) { + obj.message = message.message; + } + return obj; + }, + + create, I>>(base?: I): Response { + return Response.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): Response { + const message = createBaseResponse(); + message.code = object.code ?? 0; + message.message = object.message ?? undefined; + return message; + }, +}; + +function createBaseSystemNotifyRequest(): SystemNotifyRequest { + return { title: "", content: "" }; +} + +export const SystemNotifyRequest = { + encode(message: SystemNotifyRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.title !== "") { + writer.uint32(10).string(message.title); + } + if (message.content !== "") { + writer.uint32(18).string(message.content); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): SystemNotifyRequest { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseSystemNotifyRequest(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + + message.title = reader.string(); + continue; + case 2: + if (tag !== 18) { + break; + } + + message.content = reader.string(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): SystemNotifyRequest { + return { + title: isSet(object.title) ? globalThis.String(object.title) : "", + content: isSet(object.content) ? globalThis.String(object.content) : "", + }; + }, + + toJSON(message: SystemNotifyRequest): unknown { + const obj: any = {}; + if (message.title !== "") { + obj.title = message.title; + } + if (message.content !== "") { + obj.content = message.content; + } + return obj; + }, + + create, I>>(base?: I): SystemNotifyRequest { + return SystemNotifyRequest.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): SystemNotifyRequest { + const message = createBaseSystemNotifyRequest(); + message.title = object.title ?? ""; + message.content = object.content ?? ""; + return message; + }, +}; + +function createBaseSystemNotifyResponse(): SystemNotifyResponse { + return {}; +} + +export const SystemNotifyResponse = { + encode(_: SystemNotifyResponse, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): SystemNotifyResponse { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseSystemNotifyResponse(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(_: any): SystemNotifyResponse { + return {}; + }, + + toJSON(_: SystemNotifyResponse): unknown { + const obj: any = {}; + return obj; + }, + + create, I>>(base?: I): SystemNotifyResponse { + return SystemNotifyResponse.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(_: I): SystemNotifyResponse { + const message = createBaseSystemNotifyResponse(); + return message; + }, +}; + +export type ApiService = typeof ApiService; +export const ApiService = { + getEnvs: { + path: "/com.ql.api.Api/GetEnvs", + requestStream: false, + responseStream: false, + requestSerialize: (value: GetEnvsRequest) => Buffer.from(GetEnvsRequest.encode(value).finish()), + requestDeserialize: (value: Buffer) => GetEnvsRequest.decode(value), + responseSerialize: (value: EnvsResponse) => Buffer.from(EnvsResponse.encode(value).finish()), + responseDeserialize: (value: Buffer) => EnvsResponse.decode(value), + }, + createEnv: { + path: "/com.ql.api.Api/CreateEnv", + requestStream: false, + responseStream: false, + requestSerialize: (value: CreateEnvRequest) => Buffer.from(CreateEnvRequest.encode(value).finish()), + requestDeserialize: (value: Buffer) => CreateEnvRequest.decode(value), + responseSerialize: (value: EnvsResponse) => Buffer.from(EnvsResponse.encode(value).finish()), + responseDeserialize: (value: Buffer) => EnvsResponse.decode(value), + }, + updateEnv: { + path: "/com.ql.api.Api/UpdateEnv", + requestStream: false, + responseStream: false, + requestSerialize: (value: UpdateEnvRequest) => Buffer.from(UpdateEnvRequest.encode(value).finish()), + requestDeserialize: (value: Buffer) => UpdateEnvRequest.decode(value), + responseSerialize: (value: EnvResponse) => Buffer.from(EnvResponse.encode(value).finish()), + responseDeserialize: (value: Buffer) => EnvResponse.decode(value), + }, + deleteEnvs: { + path: "/com.ql.api.Api/DeleteEnvs", + requestStream: false, + responseStream: false, + requestSerialize: (value: DeleteEnvsRequest) => Buffer.from(DeleteEnvsRequest.encode(value).finish()), + requestDeserialize: (value: Buffer) => DeleteEnvsRequest.decode(value), + responseSerialize: (value: Response) => Buffer.from(Response.encode(value).finish()), + responseDeserialize: (value: Buffer) => Response.decode(value), + }, + moveEnv: { + path: "/com.ql.api.Api/MoveEnv", + requestStream: false, + responseStream: false, + requestSerialize: (value: MoveEnvRequest) => Buffer.from(MoveEnvRequest.encode(value).finish()), + requestDeserialize: (value: Buffer) => MoveEnvRequest.decode(value), + responseSerialize: (value: EnvResponse) => Buffer.from(EnvResponse.encode(value).finish()), + responseDeserialize: (value: Buffer) => EnvResponse.decode(value), + }, + disableEnvs: { + path: "/com.ql.api.Api/DisableEnvs", + requestStream: false, + responseStream: false, + requestSerialize: (value: DisableEnvsRequest) => Buffer.from(DisableEnvsRequest.encode(value).finish()), + requestDeserialize: (value: Buffer) => DisableEnvsRequest.decode(value), + responseSerialize: (value: Response) => Buffer.from(Response.encode(value).finish()), + responseDeserialize: (value: Buffer) => Response.decode(value), + }, + enableEnvs: { + path: "/com.ql.api.Api/EnableEnvs", + requestStream: false, + responseStream: false, + requestSerialize: (value: EnableEnvsRequest) => Buffer.from(EnableEnvsRequest.encode(value).finish()), + requestDeserialize: (value: Buffer) => EnableEnvsRequest.decode(value), + responseSerialize: (value: Response) => Buffer.from(Response.encode(value).finish()), + responseDeserialize: (value: Buffer) => Response.decode(value), + }, + updateEnvNames: { + path: "/com.ql.api.Api/UpdateEnvNames", + requestStream: false, + responseStream: false, + requestSerialize: (value: UpdateEnvNamesRequest) => Buffer.from(UpdateEnvNamesRequest.encode(value).finish()), + requestDeserialize: (value: Buffer) => UpdateEnvNamesRequest.decode(value), + responseSerialize: (value: Response) => Buffer.from(Response.encode(value).finish()), + responseDeserialize: (value: Buffer) => Response.decode(value), + }, + getEnvById: { + path: "/com.ql.api.Api/GetEnvById", + requestStream: false, + responseStream: false, + requestSerialize: (value: GetEnvByIdRequest) => Buffer.from(GetEnvByIdRequest.encode(value).finish()), + requestDeserialize: (value: Buffer) => GetEnvByIdRequest.decode(value), + responseSerialize: (value: EnvResponse) => Buffer.from(EnvResponse.encode(value).finish()), + responseDeserialize: (value: Buffer) => EnvResponse.decode(value), + }, + systemNotify: { + path: "/com.ql.api.Api/SystemNotify", + requestStream: false, + responseStream: false, + requestSerialize: (value: SystemNotifyRequest) => Buffer.from(SystemNotifyRequest.encode(value).finish()), + requestDeserialize: (value: Buffer) => SystemNotifyRequest.decode(value), + responseSerialize: (value: SystemNotifyResponse) => Buffer.from(SystemNotifyResponse.encode(value).finish()), + responseDeserialize: (value: Buffer) => SystemNotifyResponse.decode(value), + }, +} as const; + +export interface ApiServer extends UntypedServiceImplementation { + getEnvs: handleUnaryCall; + createEnv: handleUnaryCall; + updateEnv: handleUnaryCall; + deleteEnvs: handleUnaryCall; + moveEnv: handleUnaryCall; + disableEnvs: handleUnaryCall; + enableEnvs: handleUnaryCall; + updateEnvNames: handleUnaryCall; + getEnvById: handleUnaryCall; + systemNotify: handleUnaryCall; +} + +export interface ApiClient extends Client { + getEnvs( + request: GetEnvsRequest, + callback: (error: ServiceError | null, response: EnvsResponse) => void, + ): ClientUnaryCall; + getEnvs( + request: GetEnvsRequest, + metadata: Metadata, + callback: (error: ServiceError | null, response: EnvsResponse) => void, + ): ClientUnaryCall; + getEnvs( + request: GetEnvsRequest, + metadata: Metadata, + options: Partial, + callback: (error: ServiceError | null, response: EnvsResponse) => void, + ): ClientUnaryCall; + createEnv( + request: CreateEnvRequest, + callback: (error: ServiceError | null, response: EnvsResponse) => void, + ): ClientUnaryCall; + createEnv( + request: CreateEnvRequest, + metadata: Metadata, + callback: (error: ServiceError | null, response: EnvsResponse) => void, + ): ClientUnaryCall; + createEnv( + request: CreateEnvRequest, + metadata: Metadata, + options: Partial, + callback: (error: ServiceError | null, response: EnvsResponse) => void, + ): ClientUnaryCall; + updateEnv( + request: UpdateEnvRequest, + callback: (error: ServiceError | null, response: EnvResponse) => void, + ): ClientUnaryCall; + updateEnv( + request: UpdateEnvRequest, + metadata: Metadata, + callback: (error: ServiceError | null, response: EnvResponse) => void, + ): ClientUnaryCall; + updateEnv( + request: UpdateEnvRequest, + metadata: Metadata, + options: Partial, + callback: (error: ServiceError | null, response: EnvResponse) => void, + ): ClientUnaryCall; + deleteEnvs( + request: DeleteEnvsRequest, + callback: (error: ServiceError | null, response: Response) => void, + ): ClientUnaryCall; + deleteEnvs( + request: DeleteEnvsRequest, + metadata: Metadata, + callback: (error: ServiceError | null, response: Response) => void, + ): ClientUnaryCall; + deleteEnvs( + request: DeleteEnvsRequest, + metadata: Metadata, + options: Partial, + callback: (error: ServiceError | null, response: Response) => void, + ): ClientUnaryCall; + moveEnv( + request: MoveEnvRequest, + callback: (error: ServiceError | null, response: EnvResponse) => void, + ): ClientUnaryCall; + moveEnv( + request: MoveEnvRequest, + metadata: Metadata, + callback: (error: ServiceError | null, response: EnvResponse) => void, + ): ClientUnaryCall; + moveEnv( + request: MoveEnvRequest, + metadata: Metadata, + options: Partial, + callback: (error: ServiceError | null, response: EnvResponse) => void, + ): ClientUnaryCall; + disableEnvs( + request: DisableEnvsRequest, + callback: (error: ServiceError | null, response: Response) => void, + ): ClientUnaryCall; + disableEnvs( + request: DisableEnvsRequest, + metadata: Metadata, + callback: (error: ServiceError | null, response: Response) => void, + ): ClientUnaryCall; + disableEnvs( + request: DisableEnvsRequest, + metadata: Metadata, + options: Partial, + callback: (error: ServiceError | null, response: Response) => void, + ): ClientUnaryCall; + enableEnvs( + request: EnableEnvsRequest, + callback: (error: ServiceError | null, response: Response) => void, + ): ClientUnaryCall; + enableEnvs( + request: EnableEnvsRequest, + metadata: Metadata, + callback: (error: ServiceError | null, response: Response) => void, + ): ClientUnaryCall; + enableEnvs( + request: EnableEnvsRequest, + metadata: Metadata, + options: Partial, + callback: (error: ServiceError | null, response: Response) => void, + ): ClientUnaryCall; + updateEnvNames( + request: UpdateEnvNamesRequest, + callback: (error: ServiceError | null, response: Response) => void, + ): ClientUnaryCall; + updateEnvNames( + request: UpdateEnvNamesRequest, + metadata: Metadata, + callback: (error: ServiceError | null, response: Response) => void, + ): ClientUnaryCall; + updateEnvNames( + request: UpdateEnvNamesRequest, + metadata: Metadata, + options: Partial, + callback: (error: ServiceError | null, response: Response) => void, + ): ClientUnaryCall; + getEnvById( + request: GetEnvByIdRequest, + callback: (error: ServiceError | null, response: EnvResponse) => void, + ): ClientUnaryCall; + getEnvById( + request: GetEnvByIdRequest, + metadata: Metadata, + callback: (error: ServiceError | null, response: EnvResponse) => void, + ): ClientUnaryCall; + getEnvById( + request: GetEnvByIdRequest, + metadata: Metadata, + options: Partial, + callback: (error: ServiceError | null, response: EnvResponse) => void, + ): ClientUnaryCall; + systemNotify( + request: SystemNotifyRequest, + callback: (error: ServiceError | null, response: SystemNotifyResponse) => void, + ): ClientUnaryCall; + systemNotify( + request: SystemNotifyRequest, + metadata: Metadata, + callback: (error: ServiceError | null, response: SystemNotifyResponse) => void, + ): ClientUnaryCall; + systemNotify( + request: SystemNotifyRequest, + metadata: Metadata, + options: Partial, + callback: (error: ServiceError | null, response: SystemNotifyResponse) => void, + ): ClientUnaryCall; +} + +export const ApiClient = makeGenericClientConstructor(ApiService, "com.ql.api.Api") as unknown as { + new (address: string, credentials: ChannelCredentials, options?: Partial): ApiClient; + service: typeof ApiService; + serviceName: string; +}; + +type Builtin = Date | Function | Uint8Array | string | number | boolean | undefined; + +export type DeepPartial = T extends Builtin ? T + : T extends globalThis.Array ? globalThis.Array> + : T extends ReadonlyArray ? ReadonlyArray> + : T extends {} ? { [K in keyof T]?: DeepPartial } + : Partial; + +type KeysOfUnion = T extends T ? keyof T : never; +export type Exact = P extends Builtin ? P + : P & { [K in keyof P]: Exact } & { [K in Exclude>]: never }; + +function isSet(value: any): boolean { + return value !== null && value !== undefined; +} diff --git a/back/protos/cron.ts b/back/protos/cron.ts index fe74d148..d0491c1d 100644 --- a/back/protos/cron.ts +++ b/back/protos/cron.ts @@ -1,15 +1,21 @@ +// Code generated by protoc-gen-ts_proto. DO NOT EDIT. +// versions: +// protoc-gen-ts_proto v1.181.2 +// protoc v3.17.3 +// source: back/protos/cron.proto + /* eslint-disable */ import { - CallOptions, + type CallOptions, ChannelCredentials, Client, - ClientOptions, - ClientUnaryCall, - handleUnaryCall, + type ClientOptions, + type ClientUnaryCall, + type handleUnaryCall, makeGenericClientConstructor, Metadata, - ServiceError, - UntypedServiceImplementation, + type ServiceError, + type UntypedServiceImplementation, } from "@grpc/grpc-js"; import _m0 from "protobufjs/minimal"; @@ -77,19 +83,20 @@ export const ISchedule = { }, fromJSON(object: any): ISchedule { - return { schedule: isSet(object.schedule) ? String(object.schedule) : "" }; + return { schedule: isSet(object.schedule) ? globalThis.String(object.schedule) : "" }; }, toJSON(message: ISchedule): unknown { const obj: any = {}; - message.schedule !== undefined && (obj.schedule = message.schedule); + if (message.schedule !== "") { + obj.schedule = message.schedule; + } return obj; }, create, I>>(base?: I): ISchedule { - return ISchedule.fromPartial(base ?? {}); + return ISchedule.fromPartial(base ?? ({} as any)); }, - fromPartial, I>>(object: I): ISchedule { const message = createBaseISchedule(); message.schedule = object.schedule ?? ""; @@ -174,34 +181,39 @@ export const ICron = { fromJSON(object: any): ICron { return { - id: isSet(object.id) ? String(object.id) : "", - schedule: isSet(object.schedule) ? String(object.schedule) : "", - command: isSet(object.command) ? String(object.command) : "", - extraSchedules: Array.isArray(object?.extraSchedules) + id: isSet(object.id) ? globalThis.String(object.id) : "", + schedule: isSet(object.schedule) ? globalThis.String(object.schedule) : "", + command: isSet(object.command) ? globalThis.String(object.command) : "", + extraSchedules: globalThis.Array.isArray(object?.extraSchedules) ? object.extraSchedules.map((e: any) => ISchedule.fromJSON(e)) : [], - name: isSet(object.name) ? String(object.name) : "", + name: isSet(object.name) ? globalThis.String(object.name) : "", }; }, toJSON(message: ICron): unknown { const obj: any = {}; - message.id !== undefined && (obj.id = message.id); - message.schedule !== undefined && (obj.schedule = message.schedule); - message.command !== undefined && (obj.command = message.command); - if (message.extraSchedules) { - obj.extraSchedules = message.extraSchedules.map((e) => e ? ISchedule.toJSON(e) : undefined); - } else { - obj.extraSchedules = []; + if (message.id !== "") { + obj.id = message.id; + } + if (message.schedule !== "") { + obj.schedule = message.schedule; + } + if (message.command !== "") { + obj.command = message.command; + } + if (message.extraSchedules?.length) { + obj.extraSchedules = message.extraSchedules.map((e) => ISchedule.toJSON(e)); + } + if (message.name !== "") { + obj.name = message.name; } - message.name !== undefined && (obj.name = message.name); return obj; }, create, I>>(base?: I): ICron { - return ICron.fromPartial(base ?? {}); + return ICron.fromPartial(base ?? ({} as any)); }, - fromPartial, I>>(object: I): ICron { const message = createBaseICron(); message.id = object.id ?? ""; @@ -249,23 +261,20 @@ export const AddCronRequest = { }, fromJSON(object: any): AddCronRequest { - return { crons: Array.isArray(object?.crons) ? object.crons.map((e: any) => ICron.fromJSON(e)) : [] }; + return { crons: globalThis.Array.isArray(object?.crons) ? object.crons.map((e: any) => ICron.fromJSON(e)) : [] }; }, toJSON(message: AddCronRequest): unknown { const obj: any = {}; - if (message.crons) { - obj.crons = message.crons.map((e) => e ? ICron.toJSON(e) : undefined); - } else { - obj.crons = []; + if (message.crons?.length) { + obj.crons = message.crons.map((e) => ICron.toJSON(e)); } return obj; }, create, I>>(base?: I): AddCronRequest { - return AddCronRequest.fromPartial(base ?? {}); + return AddCronRequest.fromPartial(base ?? ({} as any)); }, - fromPartial, I>>(object: I): AddCronRequest { const message = createBaseAddCronRequest(); message.crons = object.crons?.map((e) => ICron.fromPartial(e)) || []; @@ -308,9 +317,8 @@ export const AddCronResponse = { }, create, I>>(base?: I): AddCronResponse { - return AddCronResponse.fromPartial(base ?? {}); + return AddCronResponse.fromPartial(base ?? ({} as any)); }, - fromPartial, I>>(_: I): AddCronResponse { const message = createBaseAddCronResponse(); return message; @@ -353,23 +361,20 @@ export const DeleteCronRequest = { }, fromJSON(object: any): DeleteCronRequest { - return { ids: Array.isArray(object?.ids) ? object.ids.map((e: any) => String(e)) : [] }; + return { ids: globalThis.Array.isArray(object?.ids) ? object.ids.map((e: any) => globalThis.String(e)) : [] }; }, toJSON(message: DeleteCronRequest): unknown { const obj: any = {}; - if (message.ids) { - obj.ids = message.ids.map((e) => e); - } else { - obj.ids = []; + if (message.ids?.length) { + obj.ids = message.ids; } return obj; }, create, I>>(base?: I): DeleteCronRequest { - return DeleteCronRequest.fromPartial(base ?? {}); + return DeleteCronRequest.fromPartial(base ?? ({} as any)); }, - fromPartial, I>>(object: I): DeleteCronRequest { const message = createBaseDeleteCronRequest(); message.ids = object.ids?.map((e) => e) || []; @@ -412,9 +417,8 @@ export const DeleteCronResponse = { }, create, I>>(base?: I): DeleteCronResponse { - return DeleteCronResponse.fromPartial(base ?? {}); + return DeleteCronResponse.fromPartial(base ?? ({} as any)); }, - fromPartial, I>>(_: I): DeleteCronResponse { const message = createBaseDeleteCronResponse(); return message; @@ -484,12 +488,14 @@ export interface CronClient extends Client { export const CronClient = makeGenericClientConstructor(CronService, "com.ql.cron.Cron") as unknown as { new (address: string, credentials: ChannelCredentials, options?: Partial): CronClient; service: typeof CronService; + serviceName: string; }; type Builtin = Date | Function | Uint8Array | string | number | boolean | undefined; export type DeepPartial = T extends Builtin ? T - : T extends Array ? Array> : T extends ReadonlyArray ? ReadonlyArray> + : T extends globalThis.Array ? globalThis.Array> + : T extends ReadonlyArray ? ReadonlyArray> : T extends {} ? { [K in keyof T]?: DeepPartial } : Partial; diff --git a/back/protos/health.ts b/back/protos/health.ts index 9266b2e9..b0360d6b 100644 --- a/back/protos/health.ts +++ b/back/protos/health.ts @@ -1,17 +1,23 @@ +// Code generated by protoc-gen-ts_proto. DO NOT EDIT. +// versions: +// protoc-gen-ts_proto v1.181.2 +// protoc v3.17.3 +// source: back/protos/health.proto + /* eslint-disable */ import { - CallOptions, + type CallOptions, ChannelCredentials, Client, - ClientOptions, + type ClientOptions, ClientReadableStream, - ClientUnaryCall, + type ClientUnaryCall, handleServerStreamingCall, - handleUnaryCall, + type handleUnaryCall, makeGenericClientConstructor, Metadata, - ServiceError, - UntypedServiceImplementation, + type ServiceError, + type UntypedServiceImplementation, } from "@grpc/grpc-js"; import _m0 from "protobufjs/minimal"; @@ -106,19 +112,20 @@ export const HealthCheckRequest = { }, fromJSON(object: any): HealthCheckRequest { - return { service: isSet(object.service) ? String(object.service) : "" }; + return { service: isSet(object.service) ? globalThis.String(object.service) : "" }; }, toJSON(message: HealthCheckRequest): unknown { const obj: any = {}; - message.service !== undefined && (obj.service = message.service); + if (message.service !== "") { + obj.service = message.service; + } return obj; }, create, I>>(base?: I): HealthCheckRequest { - return HealthCheckRequest.fromPartial(base ?? {}); + return HealthCheckRequest.fromPartial(base ?? ({} as any)); }, - fromPartial, I>>(object: I): HealthCheckRequest { const message = createBaseHealthCheckRequest(); message.service = object.service ?? ""; @@ -167,14 +174,15 @@ export const HealthCheckResponse = { toJSON(message: HealthCheckResponse): unknown { const obj: any = {}; - message.status !== undefined && (obj.status = healthCheckResponse_ServingStatusToJSON(message.status)); + if (message.status !== 0) { + obj.status = healthCheckResponse_ServingStatusToJSON(message.status); + } return obj; }, create, I>>(base?: I): HealthCheckResponse { - return HealthCheckResponse.fromPartial(base ?? {}); + return HealthCheckResponse.fromPartial(base ?? ({} as any)); }, - fromPartial, I>>(object: I): HealthCheckResponse { const message = createBaseHealthCheckResponse(); message.status = object.status ?? 0; @@ -236,12 +244,14 @@ export interface HealthClient extends Client { export const HealthClient = makeGenericClientConstructor(HealthService, "com.ql.health.Health") as unknown as { new (address: string, credentials: ChannelCredentials, options?: Partial): HealthClient; service: typeof HealthService; + serviceName: string; }; type Builtin = Date | Function | Uint8Array | string | number | boolean | undefined; export type DeepPartial = T extends Builtin ? T - : T extends Array ? Array> : T extends ReadonlyArray ? ReadonlyArray> + : T extends globalThis.Array ? globalThis.Array> + : T extends ReadonlyArray ? ReadonlyArray> : T extends {} ? { [K in keyof T]?: DeepPartial } : Partial; diff --git a/back/schedule/api.ts b/back/schedule/api.ts new file mode 100644 index 00000000..a586ee27 --- /dev/null +++ b/back/schedule/api.ts @@ -0,0 +1,171 @@ +import 'reflect-metadata'; +import { Container } from 'typedi'; +import EnvService from '../services/env'; +import { sendUnaryData, ServerUnaryCall } from '@grpc/grpc-js'; +import { + CreateEnvRequest, + DeleteEnvsRequest, + DisableEnvsRequest, + EnableEnvsRequest, + EnvItem, + EnvResponse, + EnvsResponse, + GetEnvByIdRequest, + GetEnvsRequest, + MoveEnvRequest, + Response, + SystemNotifyRequest, + SystemNotifyResponse, + UpdateEnvNamesRequest, + UpdateEnvRequest, +} from '../protos/api'; +import LoggerInstance from '../loaders/logger'; +import NotificationService from '../services/notify'; + +Container.set('logger', LoggerInstance); + +export const getEnvs = async ( + call: ServerUnaryCall, + callback: sendUnaryData, +) => { + try { + const envService = Container.get(EnvService); + const data = await envService.envs(call.request.searchValue); + callback(null, { + code: 200, + data: data.map((x) => ({ ...x, remarks: x.remarks || '' })), + }); + } catch (e: any) { + callback(null, { + code: 500, + data: [], + message: e.message, + }); + } +}; + +export const createEnv = async ( + call: ServerUnaryCall, + callback: sendUnaryData, +) => { + try { + const envService = Container.get(EnvService); + const data = await envService.create(call.request.envs); + callback(null, { code: 200, data }); + } catch (e: any) { + callback(e); + } +}; + +export const updateEnv = async ( + call: ServerUnaryCall, + callback: sendUnaryData, +) => { + try { + const envService = Container.get(EnvService); + const data = await envService.update(call.request.env as EnvItem); + callback(null, { code: 200, data }); + } catch (e: any) { + callback(e); + } +}; + +export const deleteEnvs = async ( + call: ServerUnaryCall, + callback: sendUnaryData, +) => { + try { + const envService = Container.get(EnvService); + await envService.remove(call.request.ids); + callback(null, { code: 200 }); + } catch (e: any) { + callback(e); + } +}; + +export const moveEnv = async ( + call: ServerUnaryCall, + callback: sendUnaryData, +) => { + try { + const envService = Container.get(EnvService); + const data = await envService.move(call.request.id, { + fromIndex: call.request.fromIndex, + toIndex: call.request.toIndex, + }); + callback(null, { code: 200, data }); + } catch (e: any) { + callback(e); + } +}; + +export const disableEnvs = async ( + call: ServerUnaryCall, + callback: sendUnaryData, +) => { + try { + const envService = Container.get(EnvService); + await envService.disabled(call.request.ids); + callback(null, { code: 200 }); + } catch (e: any) { + callback(e); + } +}; + +export const enableEnvs = async ( + call: ServerUnaryCall, + callback: sendUnaryData, +) => { + try { + const envService = Container.get(EnvService); + await envService.enabled(call.request.ids); + callback(null, { code: 200 }); + } catch (e: any) { + callback(e); + } +}; + +export const updateEnvNames = async ( + call: ServerUnaryCall, + callback: sendUnaryData, +) => { + try { + const envService = Container.get(EnvService); + await envService.updateNames({ + ids: call.request.ids, + name: call.request.name, + }); + callback(null, { code: 200 }); + } catch (e: any) { + callback(e); + } +}; + +export const getEnvById = async ( + call: ServerUnaryCall, + callback: sendUnaryData, +) => { + try { + const envService = Container.get(EnvService); + const data = await envService.getDb({ id: call.request.id }); + callback(null, { code: 200, data }); + } catch (e: any) { + callback(e); + } +}; + +export const systemNotify = async ( + call: ServerUnaryCall, + callback: sendUnaryData, +) => { + try { + const notifyService = Container.get(NotificationService); + const data = await notifyService.notify( + call.request.title, + call.request.content, + ); + callback(null, { code: 200, data }); + } catch (e: any) { + callback(e); + } +}; diff --git a/back/schedule/index.ts b/back/schedule/index.ts index a3b54c80..1674b6a4 100644 --- a/back/schedule/index.ts +++ b/back/schedule/index.ts @@ -6,10 +6,13 @@ import { HealthService } from '../protos/health'; import { check } from './health'; import config from '../config'; import Logger from '../loaders/logger'; +import { ApiService } from '../protos/api'; +import * as Api from './api'; const server = new Server({ 'grpc.enable_http_proxy': 0 }); server.addService(HealthService, { check }); server.addService(CronService, { addCron, delCron }); +server.addService(ApiService, Api); server.bindAsync( `0.0.0.0:${config.cronPort}`, ServerCredentials.createInsecure(), diff --git a/back/services/env.ts b/back/services/env.ts index fe209d6a..bb38e559 100644 --- a/back/services/env.ts +++ b/back/services/env.ts @@ -62,7 +62,7 @@ export default class EnvService { return await this.getDb({ id: payload.id }); } - public async remove(ids: string[]) { + public async remove(ids: number[]) { await EnvModel.destroy({ where: { id: ids } }); await this.set_envs(); } @@ -150,7 +150,7 @@ export default class EnvService { ['position', 'DESC'], ['createdAt', 'ASC'], ]); - return result as any; + return result; } catch (error) { throw error; } @@ -161,7 +161,7 @@ export default class EnvService { where: { ...query }, order: [...sort], }); - return docs; + return docs.map((x) => x.get({ plain: true })); } public async getDb(query: FindOptions['where']): Promise { @@ -172,7 +172,7 @@ export default class EnvService { return doc.get({ plain: true }); } - public async disabled(ids: string[]) { + public async disabled(ids: number[]) { await EnvModel.update( { status: EnvStatus.disabled }, { where: { id: ids } }, @@ -180,12 +180,12 @@ export default class EnvService { await this.set_envs(); } - public async enabled(ids: string[]) { + public async enabled(ids: number[]) { await EnvModel.update({ status: EnvStatus.normal }, { where: { id: ids } }); await this.set_envs(); } - public async updateNames({ ids, name }: { ids: string[]; name: string }) { + public async updateNames({ ids, name }: { ids: number[]; name: string }) { await EnvModel.update({ name }, { where: { id: ids } }); await this.set_envs(); } diff --git a/back/services/open.ts b/back/services/open.ts index 2f63ae9c..59dcc5bc 100644 --- a/back/services/open.ts +++ b/back/services/open.ts @@ -159,16 +159,15 @@ export default class OpenService { value: string; expiration: number; }> { - let systemApp = ( - await AppModel.findOne({ - where: { name: 'system' }, - }) - )?.get({ plain: true }); + const apps = await shareStore.getApps(); + const systemApp = apps?.find((x) => x.name === 'system'); if (!systemApp) { - systemApp = await this.create({ - name: 'system', - scopes: ['crons', 'system'], - } as App); + throw new Error('system app not found'); + } + const now = Math.round(Date.now() / 1000); + const currentToken = systemApp.tokens?.find((x) => x.expiration > now); + if (currentToken) { + return currentToken; } const { data } = await this.authToken({ client_id: systemApp.client_id, diff --git a/package.json b/package.json index aad1bf67..57069dbc 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,7 @@ "public": "npm run build:back && node static/build/public.js", "update": "npm run build:back && node static/build/update.js", "gen:proto": "protoc --experimental_allow_proto3_optional --plugin=./node_modules/.bin/protoc-gen-ts_proto ./back/protos/*.proto --ts_proto_out=./ --ts_proto_opt=outputServices=grpc-js,env=node,esModuleInterop=true", + "gen:api": "python3 -m grpc_tools.protoc -I. --python_out=. --grpc_python_out=. ./back/protos/api.proto", "prettier": "prettier --write '**/*.{js,jsx,tsx,ts,less,md,json}'", "postinstall": "max setup 2>/dev/null || true", "test": "umi-test", @@ -61,6 +62,7 @@ }, "dependencies": { "@grpc/grpc-js": "^1.12.3", + "@grpc/proto-loader": "^0.7.13", "@otplib/preset-default": "^12.0.1", "@sentry/node": "^8.42.0", "body-parser": "^1.20.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 04322a31..98c10563 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -11,6 +11,9 @@ dependencies: '@grpc/grpc-js': specifier: ^1.12.3 version: 1.12.3 + '@grpc/proto-loader': + specifier: ^0.7.13 + version: 0.7.13 '@keyv/sqlite': specifier: ^4.0.1 version: 4.0.1 diff --git a/sample/ql_sample.js b/sample/ql_sample.js index 8a0a6c28..e9d7e737 100644 --- a/sample/ql_sample.js +++ b/sample/ql_sample.js @@ -6,4 +6,10 @@ */ console.log('test scripts'); QLAPI.notify('test scripts', 'test desc'); +QLAPI.getEnvs({ searchValue: 'dddd' }).then(x => { + console.log(x) +}) +QLAPI.systemNotify({ title: '123', content: '231' }).then(x => { + console.log(x) +}) console.log('test desc'); diff --git a/sample/ql_sample.py b/sample/ql_sample.py index 0fbd1a24..1eff36a4 100644 --- a/sample/ql_sample.py +++ b/sample/ql_sample.py @@ -4,6 +4,9 @@ name: script name 定时规则 cron: 1 9 * * * """ + print("test script") -QLAPI.notify('test script', 'test desc') +QLAPI.notify("test script", "test desc") +QLAPI.systemNotify({"title": "test script", "content": "dddd"}) +print(QLAPI.getEnvs("1")) print("test desc") diff --git a/shell/preload/client.js b/shell/preload/client.js new file mode 100644 index 00000000..021a39b4 --- /dev/null +++ b/shell/preload/client.js @@ -0,0 +1,46 @@ +const grpc = require('@grpc/grpc-js'); +const protoLoader = require('@grpc/proto-loader'); +const path = require('path'); + +const PROTO_PATH = path.resolve(__dirname, '../../back/protos/api.proto'); +const options = { + keepCase: true, + longs: String, + enums: String, + defaults: true, +}; + +const packageDefinition = protoLoader.loadSync(PROTO_PATH, options); +const apiProto = grpc.loadPackageDefinition(packageDefinition).com.ql.api; + +const client = new apiProto.Api( + `0.0.0.0:5500`, + grpc.credentials.createInsecure(), + { 'grpc.enable_http_proxy': 0 }, +); + +const promisify = (fn) => { + return (...args) => { + return new Promise((resolve, reject) => { + fn.call(client, ...args, (err, response) => { + if (err) return reject(err); + resolve(response); + }); + }); + }; +}; + +const api = { + getEnvs: promisify(client.GetEnvs), + createEnv: promisify(client.CreateEnv), + updateEnv: promisify(client.UpdateEnv), + deleteEnvs: promisify(client.DeleteEnvs), + moveEnv: promisify(client.MoveEnv), + disableEnvs: promisify(client.DisableEnvs), + enableEnvs: promisify(client.EnableEnvs), + updateEnvNames: promisify(client.UpdateEnvNames), + getEnvById: promisify(client.GetEnvById), + systemNotify: promisify(client.SystemNotify), +}; + +module.exports = api; diff --git a/shell/preload/client.py b/shell/preload/client.py new file mode 100644 index 00000000..7892b8a0 --- /dev/null +++ b/shell/preload/client.py @@ -0,0 +1,113 @@ +import subprocess +import json +import tempfile +import os +from typing import Dict, List +from functools import wraps + + +def error_handler(func): + @wraps(func) + def wrapper(*args, **kwargs): + try: + return func(*args, **kwargs) + except json.JSONDecodeError as e: + raise Exception(f"parse json error: {str(e)}") + except subprocess.SubprocessError as e: + raise Exception(f"node process error: {str(e)}") + except Exception as e: + raise Exception(f"unknown error: {str(e)}") + + return wrapper + + +class Client: + def __init__(self): + self.temp_dir = tempfile.mkdtemp(prefix="node_client_") + self.temp_script = os.path.join(self.temp_dir, "temp_script.js") + + def __del__(self): + try: + if os.path.exists(self.temp_script): + os.remove(self.temp_script) + os.rmdir(self.temp_dir) + except Exception: + pass + + @error_handler + def _execute_node(self, method: str, params: Dict = None) -> Dict: + node_code = f""" + const api = require('{os.getenv("QL_DIR")}/shell/preload/client.js'); + + (async () => {{ + try {{ + const result = await api.{method}({json.dumps(params) if params else ''}); + console.log(JSON.stringify(result)); + }} catch (error) {{ + console.error(JSON.stringify({{ + error: error.message, + stack: error.stack + }})); + process.exit(1); + }} + }})(); + """ + + with open(self.temp_script, "w", encoding="utf-8") as f: + f.write(node_code) + + try: + result = subprocess.run( + ["node", self.temp_script], + capture_output=True, + text=True, + timeout=30, + ) + + if result.returncode != 0: + error_data = json.loads(result.stderr) + raise Exception(f"{error_data.get('stack')}") + + return json.loads(result.stdout) + except subprocess.TimeoutExpired: + raise Exception("node process timeout") + + @error_handler + def getEnvs(self, params: Dict = None) -> Dict: + return self._execute_node("getEnvs", params) + + @error_handler + def createEnv(self, data: Dict) -> Dict: + return self._execute_node("createEnv", data) + + @error_handler + def updateEnv(self, data: Dict) -> Dict: + return self._execute_node("updateEnv", data) + + @error_handler + def deleteEnvs(self, env_ids: List[str]) -> Dict: + return self._execute_node("deleteEnvs", {"ids": env_ids}) + + @error_handler + def moveEnv(self, data: Dict) -> Dict: + return self._execute_node("moveEnv", data) + + @error_handler + def disableEnvs(self, env_ids: List[str]) -> Dict: + return self._execute_node("disableEnvs", {"ids": env_ids}) + + @error_handler + def enableEnvs(self, env_ids: List[str]) -> Dict: + return self._execute_node("enableEnvs", {"ids": env_ids}) + + @error_handler + def updateEnvNames(self, data: Dict) -> Dict: + return self._execute_node("updateEnvNames", data) + + @error_handler + def getEnvById(self, env_id: str) -> Dict: + return self._execute_node("getEnvById", {"id": env_id}) + + @error_handler + def systemNotify(self, data: Dict) -> Dict: + return self._execute_node("systemNotify", data) diff --git a/shell/preload/sitecustomize.js b/shell/preload/sitecustomize.js index 5a4cdfbf..424674f7 100644 --- a/shell/preload/sitecustomize.js +++ b/shell/preload/sitecustomize.js @@ -1,4 +1,5 @@ const { execSync } = require('child_process'); +const client = require('./client.js'); require(`./env.js`); function expandRange(rangeStr, max) { @@ -100,6 +101,7 @@ try { const { sendNotify } = require('./notify.js'); global.QLAPI = { notify: sendNotify, + ...client, }; } catch (error) { console.log(`run builtin code error: `, error, '\n'); diff --git a/shell/preload/sitecustomize.py b/shell/preload/sitecustomize.py index b3b5ad96..7e796e61 100644 --- a/shell/preload/sitecustomize.py +++ b/shell/preload/sitecustomize.py @@ -6,6 +6,7 @@ import builtins import sys import env import signal +from client import Client def try_parse_int(value): @@ -108,7 +109,7 @@ try: from notify import send - class BaseApi: + class BaseApi(Client): def notify(self, *args, **kwargs): return send(*args, **kwargs)