mirror of
https://github.com/hcengineering/platform.git
synced 2025-04-21 15:59:15 +00:00
parent
afc881a7c6
commit
85d040010c
@ -272,7 +272,7 @@ export class TxOperations implements Omit<Client, 'notify'> {
|
|||||||
return new ApplyOperations(this, scope)
|
return new ApplyOperations(this, scope)
|
||||||
}
|
}
|
||||||
|
|
||||||
async diffUpdate (doc: Doc, raw: Doc | Data<Doc>, date: Timestamp): Promise<Doc> {
|
async diffUpdate (doc: Doc, raw: Doc | Data<Doc>, date: Timestamp, account?: Ref<Account>): Promise<Doc> {
|
||||||
// We need to update fields if they are different.
|
// We need to update fields if they are different.
|
||||||
const documentUpdate: DocumentUpdate<Doc> = {}
|
const documentUpdate: DocumentUpdate<Doc> = {}
|
||||||
for (const [k, v] of Object.entries(raw)) {
|
for (const [k, v] of Object.entries(raw)) {
|
||||||
@ -285,7 +285,7 @@ export class TxOperations implements Omit<Client, 'notify'> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (Object.keys(documentUpdate).length > 0) {
|
if (Object.keys(documentUpdate).length > 0) {
|
||||||
await this.update(doc, documentUpdate, false, date, doc.modifiedBy)
|
await this.update(doc, documentUpdate, false, date, account ?? doc.modifiedBy)
|
||||||
TxProcessor.applyUpdate(doc, documentUpdate)
|
TxProcessor.applyUpdate(doc, documentUpdate)
|
||||||
}
|
}
|
||||||
return doc
|
return doc
|
||||||
|
@ -50,8 +50,8 @@
|
|||||||
|
|
||||||
export let project: Project | undefined = undefined
|
export let project: Project | undefined = undefined
|
||||||
|
|
||||||
export let namePlaceholder: ''
|
export let namePlaceholder: string = ''
|
||||||
export let descriptionPlaceholder: ''
|
export let descriptionPlaceholder: string = ''
|
||||||
export let statusFactory: (
|
export let statusFactory: (
|
||||||
client: TxOperations | ApplyOperations,
|
client: TxOperations | ApplyOperations,
|
||||||
spaceId: Status['space'],
|
spaceId: Status['space'],
|
||||||
@ -208,6 +208,8 @@
|
|||||||
{ _id: { $nin: project ? [project._id] : [] } },
|
{ _id: { $nin: project ? [project._id] : [] } },
|
||||||
(res) => (projectsIdentifiers = new Set(res.map(({ identifier }) => identifier)))
|
(res) => (projectsIdentifiers = new Set(res.map(({ identifier }) => identifier)))
|
||||||
)
|
)
|
||||||
|
|
||||||
|
$: identifier = identifier.toLocaleUpperCase().replaceAll('-', '_').replaceAll(' ', '_').substring(0, 5)
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<Card
|
<Card
|
||||||
@ -237,7 +239,7 @@
|
|||||||
autoFocus
|
autoFocus
|
||||||
on:input={() => {
|
on:input={() => {
|
||||||
if (isNew) {
|
if (isNew) {
|
||||||
identifier = name.toLocaleUpperCase().replaceAll(' ', '_').substring(0, 5)
|
identifier = name.toLocaleUpperCase().replaceAll('-', '_').replaceAll(' ', '_').substring(0, 5)
|
||||||
color = isColorSelected ? color : getColorNumberByText(name)
|
color = isColorSelected ? color : getColorNumberByText(name)
|
||||||
}
|
}
|
||||||
}}
|
}}
|
||||||
@ -253,7 +255,6 @@
|
|||||||
<div bind:this={changeIdentityRef} class="padding flex-row-center relative">
|
<div bind:this={changeIdentityRef} class="padding flex-row-center relative">
|
||||||
<EditBox
|
<EditBox
|
||||||
bind:value={identifier}
|
bind:value={identifier}
|
||||||
on:input
|
|
||||||
disabled={!isNew}
|
disabled={!isNew}
|
||||||
placeholder={tracker.string.ProjectIdentifierPlaceholder}
|
placeholder={tracker.string.ProjectIdentifierPlaceholder}
|
||||||
kind={'large-style'}
|
kind={'large-style'}
|
||||||
|
@ -14,134 +14,5 @@
|
|||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
//
|
//
|
||||||
|
|
||||||
import { MinioService } from '@hcengineering/minio'
|
import { startFront } from './starter'
|
||||||
import { setMetadata } from '@hcengineering/platform'
|
startFront()
|
||||||
import serverToken from '@hcengineering/server-token'
|
|
||||||
import { start } from '.'
|
|
||||||
|
|
||||||
const defaultLanguage = process.env.DEFAULT_LANGUAGE ?? 'en'
|
|
||||||
const SERVER_PORT = parseInt(process.env.SERVER_PORT ?? '8080')
|
|
||||||
|
|
||||||
const transactorEndpoint = process.env.TRANSACTOR_URL
|
|
||||||
if (transactorEndpoint === undefined) {
|
|
||||||
console.error('please provide transactor url')
|
|
||||||
process.exit(1)
|
|
||||||
}
|
|
||||||
|
|
||||||
const elasticUrl = process.env.ELASTIC_URL
|
|
||||||
if (elasticUrl === undefined) {
|
|
||||||
console.error('please provide elastic url')
|
|
||||||
process.exit(1)
|
|
||||||
}
|
|
||||||
|
|
||||||
const minioEndpoint = process.env.MINIO_ENDPOINT
|
|
||||||
if (minioEndpoint === undefined) {
|
|
||||||
console.error('please provide minio endpoint')
|
|
||||||
process.exit(1)
|
|
||||||
}
|
|
||||||
|
|
||||||
const minioAccessKey = process.env.MINIO_ACCESS_KEY
|
|
||||||
if (minioAccessKey === undefined) {
|
|
||||||
console.error('please provide minio access key')
|
|
||||||
process.exit(1)
|
|
||||||
}
|
|
||||||
|
|
||||||
const minioSecretKey = process.env.MINIO_SECRET_KEY
|
|
||||||
if (minioSecretKey === undefined) {
|
|
||||||
console.error('please provide minio secret key')
|
|
||||||
process.exit(1)
|
|
||||||
}
|
|
||||||
|
|
||||||
const minio = new MinioService({
|
|
||||||
endPoint: minioEndpoint,
|
|
||||||
port: 9000,
|
|
||||||
useSSL: false,
|
|
||||||
accessKey: minioAccessKey,
|
|
||||||
secretKey: minioSecretKey
|
|
||||||
})
|
|
||||||
|
|
||||||
const accountsUrl = process.env.ACCOUNTS_URL
|
|
||||||
if (accountsUrl === undefined) {
|
|
||||||
console.error('please provide accounts url')
|
|
||||||
process.exit(1)
|
|
||||||
}
|
|
||||||
|
|
||||||
const uploadUrl = process.env.UPLOAD_URL
|
|
||||||
if (uploadUrl === undefined) {
|
|
||||||
console.error('please provide upload url')
|
|
||||||
process.exit(1)
|
|
||||||
}
|
|
||||||
|
|
||||||
const collaboratorUrl = process.env.COLLABORATOR_URL
|
|
||||||
if (collaboratorUrl === undefined) {
|
|
||||||
console.error('please provide collaborator url')
|
|
||||||
process.exit(1)
|
|
||||||
}
|
|
||||||
|
|
||||||
const gmailUrl = process.env.GMAIL_URL
|
|
||||||
if (gmailUrl === undefined) {
|
|
||||||
console.error('please provide gmail url')
|
|
||||||
process.exit(1)
|
|
||||||
}
|
|
||||||
|
|
||||||
const calendarUrl = process.env.CALENDAR_URL
|
|
||||||
if (calendarUrl === undefined) {
|
|
||||||
console.error('please provide calendar service url')
|
|
||||||
process.exit(1)
|
|
||||||
}
|
|
||||||
|
|
||||||
const telegramUrl = process.env.TELEGRAM_URL
|
|
||||||
if (telegramUrl === undefined) {
|
|
||||||
console.error('please provide telegram url')
|
|
||||||
process.exit(1)
|
|
||||||
}
|
|
||||||
|
|
||||||
const rekoniUrl = process.env.REKONI_URL
|
|
||||||
if (rekoniUrl === undefined) {
|
|
||||||
console.error('please provide rekoni url')
|
|
||||||
process.exit(1)
|
|
||||||
}
|
|
||||||
|
|
||||||
const modelVersion = process.env.MODEL_VERSION
|
|
||||||
if (modelVersion === undefined) {
|
|
||||||
console.error('please provide model version requirement')
|
|
||||||
process.exit(1)
|
|
||||||
}
|
|
||||||
|
|
||||||
const serverSecret = process.env.SERVER_SECRET
|
|
||||||
if (serverSecret === undefined) {
|
|
||||||
console.log('Please provide server secret')
|
|
||||||
process.exit(1)
|
|
||||||
}
|
|
||||||
|
|
||||||
const title = process.env.TITLE
|
|
||||||
|
|
||||||
setMetadata(serverToken.metadata.Secret, serverSecret)
|
|
||||||
|
|
||||||
const config = {
|
|
||||||
transactorEndpoint,
|
|
||||||
elasticUrl,
|
|
||||||
minio,
|
|
||||||
accountsUrl,
|
|
||||||
uploadUrl,
|
|
||||||
modelVersion,
|
|
||||||
collaboratorUrl,
|
|
||||||
gmailUrl,
|
|
||||||
telegramUrl,
|
|
||||||
rekoniUrl,
|
|
||||||
calendarUrl,
|
|
||||||
title,
|
|
||||||
defaultLanguage
|
|
||||||
}
|
|
||||||
console.log('Starting Front service with', config)
|
|
||||||
const shutdown = start(config, SERVER_PORT)
|
|
||||||
|
|
||||||
const close = (): void => {
|
|
||||||
console.trace('Exiting from server')
|
|
||||||
console.log('Shutdown request accepted')
|
|
||||||
shutdown()
|
|
||||||
process.exit(0)
|
|
||||||
}
|
|
||||||
|
|
||||||
process.on('SIGINT', close)
|
|
||||||
process.on('SIGTERM', close)
|
|
||||||
|
@ -144,7 +144,8 @@ export function start (
|
|||||||
title?: string
|
title?: string
|
||||||
defaultLanguage: string
|
defaultLanguage: string
|
||||||
},
|
},
|
||||||
port: number
|
port: number,
|
||||||
|
extraConfig?: Record<string, string>
|
||||||
): () => void {
|
): () => void {
|
||||||
const app = express()
|
const app = express()
|
||||||
|
|
||||||
@ -181,7 +182,8 @@ export function start (
|
|||||||
GMAIL_URL: config.gmailUrl,
|
GMAIL_URL: config.gmailUrl,
|
||||||
CALENDAR_URL: config.calendarUrl,
|
CALENDAR_URL: config.calendarUrl,
|
||||||
TITLE: config.title,
|
TITLE: config.title,
|
||||||
DEFAULT_LANGUAGE: config.defaultLanguage
|
DEFAULT_LANGUAGE: config.defaultLanguage,
|
||||||
|
...(extraConfig ?? {})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
149
server/front/src/starter.ts
Normal file
149
server/front/src/starter.ts
Normal file
@ -0,0 +1,149 @@
|
|||||||
|
//
|
||||||
|
// Copyright © 2020, 2021 Anticrm Platform Contributors.
|
||||||
|
// Copyright © 2021 Hardcore Engineering Inc.
|
||||||
|
//
|
||||||
|
// Licensed under the Eclipse Public License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License. You may
|
||||||
|
// obtain a copy of the License at https://www.eclipse.org/legal/epl-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
//
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
//
|
||||||
|
|
||||||
|
import { MinioService } from '@hcengineering/minio'
|
||||||
|
import { setMetadata } from '@hcengineering/platform'
|
||||||
|
import serverToken from '@hcengineering/server-token'
|
||||||
|
import { start } from '.'
|
||||||
|
|
||||||
|
export function startFront (extraConfig?: Record<string, string>): void {
|
||||||
|
const defaultLanguage = process.env.DEFAULT_LANGUAGE ?? 'en'
|
||||||
|
const SERVER_PORT = parseInt(process.env.SERVER_PORT ?? '8080')
|
||||||
|
|
||||||
|
const transactorEndpoint = process.env.TRANSACTOR_URL
|
||||||
|
if (transactorEndpoint === undefined) {
|
||||||
|
console.error('please provide transactor url')
|
||||||
|
process.exit(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
const elasticUrl = process.env.ELASTIC_URL
|
||||||
|
if (elasticUrl === undefined) {
|
||||||
|
console.error('please provide elastic url')
|
||||||
|
process.exit(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
const minioEndpoint = process.env.MINIO_ENDPOINT
|
||||||
|
if (minioEndpoint === undefined) {
|
||||||
|
console.error('please provide minio endpoint')
|
||||||
|
process.exit(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
const minioAccessKey = process.env.MINIO_ACCESS_KEY
|
||||||
|
if (minioAccessKey === undefined) {
|
||||||
|
console.error('please provide minio access key')
|
||||||
|
process.exit(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
const minioSecretKey = process.env.MINIO_SECRET_KEY
|
||||||
|
if (minioSecretKey === undefined) {
|
||||||
|
console.error('please provide minio secret key')
|
||||||
|
process.exit(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
const minio = new MinioService({
|
||||||
|
endPoint: minioEndpoint,
|
||||||
|
port: 9000,
|
||||||
|
useSSL: false,
|
||||||
|
accessKey: minioAccessKey,
|
||||||
|
secretKey: minioSecretKey
|
||||||
|
})
|
||||||
|
|
||||||
|
const accountsUrl = process.env.ACCOUNTS_URL
|
||||||
|
if (accountsUrl === undefined) {
|
||||||
|
console.error('please provide accounts url')
|
||||||
|
process.exit(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
const uploadUrl = process.env.UPLOAD_URL
|
||||||
|
if (uploadUrl === undefined) {
|
||||||
|
console.error('please provide upload url')
|
||||||
|
process.exit(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
const collaboratorUrl = process.env.COLLABORATOR_URL
|
||||||
|
if (collaboratorUrl === undefined) {
|
||||||
|
console.error('please provide collaborator url')
|
||||||
|
process.exit(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
const gmailUrl = process.env.GMAIL_URL
|
||||||
|
if (gmailUrl === undefined) {
|
||||||
|
console.error('please provide gmail url')
|
||||||
|
process.exit(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
const calendarUrl = process.env.CALENDAR_URL
|
||||||
|
if (calendarUrl === undefined) {
|
||||||
|
console.error('please provide calendar service url')
|
||||||
|
process.exit(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
const telegramUrl = process.env.TELEGRAM_URL
|
||||||
|
if (telegramUrl === undefined) {
|
||||||
|
console.error('please provide telegram url')
|
||||||
|
process.exit(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
const rekoniUrl = process.env.REKONI_URL
|
||||||
|
if (rekoniUrl === undefined) {
|
||||||
|
console.error('please provide rekoni url')
|
||||||
|
process.exit(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
const modelVersion = process.env.MODEL_VERSION
|
||||||
|
if (modelVersion === undefined) {
|
||||||
|
console.error('please provide model version requirement')
|
||||||
|
process.exit(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
const serverSecret = process.env.SERVER_SECRET
|
||||||
|
if (serverSecret === undefined) {
|
||||||
|
console.log('Please provide server secret')
|
||||||
|
process.exit(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
const title = process.env.TITLE
|
||||||
|
|
||||||
|
setMetadata(serverToken.metadata.Secret, serverSecret)
|
||||||
|
|
||||||
|
const config = {
|
||||||
|
transactorEndpoint,
|
||||||
|
elasticUrl,
|
||||||
|
minio,
|
||||||
|
accountsUrl,
|
||||||
|
uploadUrl,
|
||||||
|
modelVersion,
|
||||||
|
collaboratorUrl,
|
||||||
|
gmailUrl,
|
||||||
|
telegramUrl,
|
||||||
|
rekoniUrl,
|
||||||
|
calendarUrl,
|
||||||
|
title,
|
||||||
|
defaultLanguage
|
||||||
|
}
|
||||||
|
console.log('Starting Front service with', config)
|
||||||
|
const shutdown = start(config, SERVER_PORT, extraConfig)
|
||||||
|
|
||||||
|
const close = (): void => {
|
||||||
|
console.trace('Exiting from server')
|
||||||
|
console.log('Shutdown request accepted')
|
||||||
|
shutdown()
|
||||||
|
process.exit(0)
|
||||||
|
}
|
||||||
|
|
||||||
|
process.on('SIGINT', close)
|
||||||
|
process.on('SIGTERM', close)
|
||||||
|
}
|
@ -13,7 +13,7 @@
|
|||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
//
|
//
|
||||||
|
|
||||||
import core, { MeasureContext, ServerStorage, Tx } from '@hcengineering/core'
|
import core, { MeasureContext, ServerStorage, Tx, systemAccountEmail } from '@hcengineering/core'
|
||||||
import { BroadcastFunc, Middleware, SessionContext, TxMiddlewareResult } from '@hcengineering/server-core'
|
import { BroadcastFunc, Middleware, SessionContext, TxMiddlewareResult } from '@hcengineering/server-core'
|
||||||
import { BaseMiddleware } from './base'
|
import { BaseMiddleware } from './base'
|
||||||
|
|
||||||
@ -35,7 +35,7 @@ export class ModifiedMiddleware extends BaseMiddleware implements Middleware {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async tx (ctx: SessionContext, tx: Tx): Promise<TxMiddlewareResult> {
|
async tx (ctx: SessionContext, tx: Tx): Promise<TxMiddlewareResult> {
|
||||||
if (tx.modifiedBy !== core.account.System) {
|
if (tx.modifiedBy !== core.account.System && ctx.userEmail !== systemAccountEmail) {
|
||||||
tx.modifiedOn = Date.now()
|
tx.modifiedOn = Date.now()
|
||||||
tx.createdOn = tx.createdOn ?? tx.modifiedOn
|
tx.createdOn = tx.createdOn ?? tx.modifiedOn
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user