mirror of https://github.com/nocodb/nocodb
8 changed files with 352 additions and 45 deletions
@ -0,0 +1,145 @@
|
||||
import type {CalendarRangeType} from 'nocodb-sdk'; |
||||
import Noco from '~/Noco'; |
||||
import NocoCache from '~/cache/NocoCache'; |
||||
import {extractProps} from '~/helpers/extractProps'; |
||||
import {CacheGetType, CacheScope, MetaTable} from '~/utils/globals'; |
||||
|
||||
export default class CalendarRange implements CalendarRangeType { |
||||
id: string; |
||||
fk_from_column_id: string; |
||||
fk_to_column_id: string | null; |
||||
fk_view_id: string; |
||||
|
||||
constructor(data: Partial<CalendarRange>) { |
||||
Object.assign(this, data); |
||||
} |
||||
|
||||
public static async insert( |
||||
data: Partial<CalendarRange>, |
||||
ncMeta = Noco.ncMeta, |
||||
) { |
||||
const insertObj = extractProps(data, [ |
||||
'fk_from_column_id', |
||||
'fk_to_column_id', |
||||
'fk_view_id', |
||||
]); |
||||
|
||||
const { id } = await ncMeta.metaInsert2( |
||||
null, |
||||
null, |
||||
MetaTable.CALENDAR_VIEW_RANGE, |
||||
insertObj, |
||||
); |
||||
|
||||
await NocoCache.appendToList( |
||||
CacheScope.CALENDAR_VIEW_RANGE, |
||||
[data.fk_view_id], |
||||
`${CacheScope.CALENDAR_VIEW_RANGE}:${id}`, |
||||
); |
||||
|
||||
return this.get(id, ncMeta); |
||||
} |
||||
|
||||
public static async bulkInsert( |
||||
data: Partial<CalendarRange>[], |
||||
ncMeta = Noco.ncMeta, |
||||
) { |
||||
const insertObj = []; |
||||
|
||||
for (const d of data) { |
||||
const tempObj = extractProps(d, [ |
||||
'fk_from_column_id', |
||||
'fk_to_column_id', |
||||
'fk_view_id', |
||||
]); |
||||
insertObj.push(tempObj); |
||||
} |
||||
|
||||
const bulkData = await ncMeta.bulkMetaInsert( |
||||
null, |
||||
null, |
||||
MetaTable.CALENDAR_VIEW_RANGE, |
||||
insertObj, |
||||
); |
||||
|
||||
for (const d of bulkData) { |
||||
await NocoCache.appendToList( |
||||
CacheScope.CALENDAR_VIEW_RANGE, |
||||
[d.fk_view_id], |
||||
`${CacheScope.CALENDAR_VIEW_RANGE}:${d.id}`, |
||||
); |
||||
await NocoCache.set(`${CacheScope.CALENDAR_VIEW_RANGE}:${d.id}`, d); |
||||
} |
||||
|
||||
return true; |
||||
} |
||||
|
||||
public static async get( |
||||
calendarRangeId: string, |
||||
ncMeta = Noco.ncMeta, |
||||
): Promise<CalendarRange> { |
||||
let data = |
||||
calendarRangeId && |
||||
(await NocoCache.get( |
||||
`${CacheScope.CALENDAR_VIEW_RANGE}:${calendarRangeId}`, |
||||
CacheGetType.TYPE_OBJECT, |
||||
)); |
||||
if (!data) { |
||||
data = await ncMeta.metaGet2( |
||||
null, |
||||
null, |
||||
MetaTable.CALENDAR_VIEW_RANGE, |
||||
calendarRangeId, |
||||
); |
||||
await NocoCache.set( |
||||
`${CacheScope.CALENDAR_VIEW_RANGE}:${calendarRangeId}`, |
||||
data, |
||||
); |
||||
} |
||||
return data && new CalendarRange(data); |
||||
} |
||||
|
||||
public static async read(fk_view_id: string, ncMeta = Noco.ncMeta) { |
||||
const cachedList = await NocoCache.getList(CacheScope.CALENDAR_VIEW, [ |
||||
fk_view_id, |
||||
]); |
||||
let { list: ranges } = cachedList; |
||||
const { isNoneList } = cachedList; |
||||
if (!isNoneList && !ranges.length) { |
||||
ranges = await ncMeta.metaList2( |
||||
null, //,
|
||||
null, //model.db_alias,
|
||||
MetaTable.CALENDAR_VIEW_RANGE, |
||||
{ condition: { fk_view_id } }, |
||||
); |
||||
await NocoCache.setList( |
||||
CacheScope.CALENDAR_VIEW_RANGE, |
||||
[fk_view_id], |
||||
ranges.map(({ created_at, updated_at, ...others }) => others), |
||||
); |
||||
} |
||||
|
||||
return ranges?.length |
||||
? { |
||||
ranges: ranges |
||||
.map(({ created_at, updated_at, ...c }) => new CalendarRange(c)) |
||||
} |
||||
: null; |
||||
} |
||||
|
||||
public static async find( |
||||
fk_view_id: string, |
||||
ncMeta = Noco.ncMeta, |
||||
): Promise<CalendarRange> { |
||||
const data = await ncMeta.metaGet2( |
||||
null, |
||||
null, |
||||
MetaTable.CALENDAR_VIEW_RANGE, |
||||
{ |
||||
fk_view_id, |
||||
}, |
||||
); |
||||
|
||||
return data && new CalendarRange(data); |
||||
} |
||||
} |
@ -0,0 +1,75 @@
|
||||
import {Injectable} from '@nestjs/common'; |
||||
import type {CalendarUpdateReqType, UserType, ViewCreateReqType,} from 'nocodb-sdk'; |
||||
import {AppEvents, ViewTypes} from 'nocodb-sdk'; |
||||
import type {NcRequest} from '~/interface/config'; |
||||
import {AppHooksService} from '~/services/app-hooks/app-hooks.service'; |
||||
import {validatePayload} from '~/helpers'; |
||||
import {NcError} from '~/helpers/catchError'; |
||||
import {CalendarView, View} from '~/models'; |
||||
|
||||
@Injectable() |
||||
export class CalendarsService { |
||||
constructor(private readonly appHooksService: AppHooksService) { |
||||
} |
||||
|
||||
async calendarViewGet(param: { calendarViewId: string }) { |
||||
return await CalendarView.get(param.calendarViewId); |
||||
} |
||||
|
||||
async calendarViewCreate(param: { |
||||
tableId: string; |
||||
calendar: ViewCreateReqType; |
||||
user: UserType; |
||||
req: NcRequest; |
||||
}) { |
||||
- |
||||
validatePayload( |
||||
'swagger.json#/components/schemas/ViewCreateReq', |
||||
param.calendar, |
||||
); |
||||
|
||||
const view = await View.insert({ |
||||
...param.calendar, |
||||
// todo: sanitize
|
||||
fk_model_id: param.tableId, |
||||
type: ViewTypes.CALENDAR, |
||||
}); |
||||
|
||||
this.appHooksService.emit(AppEvents.VIEW_CREATE, { |
||||
view, |
||||
showAs: 'calendar', |
||||
user: param.user, |
||||
|
||||
req: param.req, |
||||
}); |
||||
|
||||
return view; |
||||
} |
||||
|
||||
async calendarViewUpdate(param: { |
||||
calendarViewId: string; |
||||
calendar: CalendarUpdateReqType; |
||||
req: NcRequest; |
||||
}) { |
||||
validatePayload( |
||||
'swagger.json#/components/schemas/CalendarUpdateReq', |
||||
param.calendar, |
||||
); |
||||
|
||||
const view = await View.get(param.calendarViewId); |
||||
|
||||
if (!view) { |
||||
NcError.badRequest('View not found'); |
||||
} |
||||
|
||||
const res = await CalendarView.update(param.calendarViewId, param.calendar); |
||||
|
||||
this.appHooksService.emit(AppEvents.VIEW_UPDATE, { |
||||
view, |
||||
showAs: 'calendar', |
||||
req: param.req, |
||||
}); |
||||
|
||||
return res; |
||||
} |
||||
} |
Loading…
Reference in new issue