|
|
|
@@ -2307,601 +2307,6 @@ func groupMemberCacheID(topic string, uid types.Uid) string {
|
|
|
|
|
return strings.TrimSpace(topic) + ":" + uid.String()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type WorkbenchPersistenceInterface interface {
|
|
|
|
|
Get(tenantID types.TenantID, uid types.Uid) ([]types.WorkbenchModule, int, error)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type workbenchMapper struct{}
|
|
|
|
|
|
|
|
|
|
var Workbench WorkbenchPersistenceInterface
|
|
|
|
|
|
|
|
|
|
func (workbenchMapper) Get(tenantID types.TenantID, uid types.Uid) ([]types.WorkbenchModule, int, error) {
|
|
|
|
|
if uid.IsZero() {
|
|
|
|
|
return nil, 0, types.ErrMalformed
|
|
|
|
|
}
|
|
|
|
|
tenantAdp, err := tenantBusinessAdapter(tenantID)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, 0, err
|
|
|
|
|
}
|
|
|
|
|
return tenantAdp.TenantWorkbenchModules(tenantID, uid)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type OrganizationPersistenceInterface interface {
|
|
|
|
|
ListDepartments(tenantID types.TenantID, uid types.Uid, parentID, cursor string, limit int) ([]types.OrganizationDepartment, string, error)
|
|
|
|
|
ListMembers(tenantID types.TenantID, uid types.Uid, departmentID, cursor string, limit int) ([]types.OrganizationMember, string, error)
|
|
|
|
|
ListAllMembers(tenantID types.TenantID, uid types.Uid, departmentID, queryText, cursor string, limit int) ([]types.OrganizationMember, string, error)
|
|
|
|
|
Search(tenantID types.TenantID, uid types.Uid, queryText, resultTypes, cursor string, limit int) ([]types.OrganizationSearchItem, string, error)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type organizationMapper struct{}
|
|
|
|
|
|
|
|
|
|
var Organization OrganizationPersistenceInterface
|
|
|
|
|
|
|
|
|
|
func (organizationMapper) ListDepartments(tenantID types.TenantID, uid types.Uid, parentID, cursor string, limit int) ([]types.OrganizationDepartment, string, error) {
|
|
|
|
|
if uid.IsZero() {
|
|
|
|
|
return nil, "", types.ErrMalformed
|
|
|
|
|
}
|
|
|
|
|
if limit <= 0 || limit > 100 {
|
|
|
|
|
limit = 50
|
|
|
|
|
}
|
|
|
|
|
tenantAdp, err := tenantBusinessAdapter(tenantID)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, "", err
|
|
|
|
|
}
|
|
|
|
|
return tenantAdp.TenantOrganizationDepartments(tenantID, uid, strings.TrimSpace(parentID), strings.TrimSpace(cursor), limit)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (organizationMapper) ListMembers(tenantID types.TenantID, uid types.Uid, departmentID, cursor string, limit int) ([]types.OrganizationMember, string, error) {
|
|
|
|
|
if uid.IsZero() || strings.TrimSpace(departmentID) == "" {
|
|
|
|
|
return nil, "", types.ErrMalformed
|
|
|
|
|
}
|
|
|
|
|
if limit <= 0 || limit > 100 {
|
|
|
|
|
limit = 50
|
|
|
|
|
}
|
|
|
|
|
tenantAdp, err := tenantBusinessAdapter(tenantID)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, "", err
|
|
|
|
|
}
|
|
|
|
|
return tenantAdp.TenantOrganizationMembers(tenantID, uid, strings.TrimSpace(departmentID), strings.TrimSpace(cursor), limit)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (organizationMapper) ListAllMembers(tenantID types.TenantID, uid types.Uid, departmentID, queryText, cursor string, limit int) ([]types.OrganizationMember, string, error) {
|
|
|
|
|
if uid.IsZero() {
|
|
|
|
|
return nil, "", types.ErrMalformed
|
|
|
|
|
}
|
|
|
|
|
if limit <= 0 || limit > 100 {
|
|
|
|
|
limit = 50
|
|
|
|
|
}
|
|
|
|
|
tenantAdp, err := tenantBusinessAdapter(tenantID)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, "", err
|
|
|
|
|
}
|
|
|
|
|
return tenantAdp.TenantOrganizationMembersAll(tenantID, uid, strings.TrimSpace(departmentID), strings.TrimSpace(queryText), strings.TrimSpace(cursor), limit)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (organizationMapper) Search(tenantID types.TenantID, uid types.Uid, queryText, resultTypes, cursor string, limit int) ([]types.OrganizationSearchItem, string, error) {
|
|
|
|
|
if uid.IsZero() || strings.TrimSpace(queryText) == "" {
|
|
|
|
|
return nil, "", types.ErrMalformed
|
|
|
|
|
}
|
|
|
|
|
if limit <= 0 || limit > 100 {
|
|
|
|
|
limit = 50
|
|
|
|
|
}
|
|
|
|
|
tenantAdp, err := tenantBusinessAdapter(tenantID)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, "", err
|
|
|
|
|
}
|
|
|
|
|
return tenantAdp.TenantOrganizationSearch(tenantID, uid, strings.TrimSpace(queryText), strings.TrimSpace(resultTypes), strings.TrimSpace(cursor), limit)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type AttendancePersistenceInterface interface {
|
|
|
|
|
Config(tenantID types.TenantID, uid types.Uid, date time.Time) (*types.AttendanceConfig, error)
|
|
|
|
|
ListRecords(tenantID types.TenantID, uid types.Uid, opts types.AttendanceRecordListOptions) ([]types.AttendanceRecord, string, *types.AttendanceRecordStats, error)
|
|
|
|
|
Checkin(tenantID types.TenantID, uid types.Uid, checkinID string, req types.AttendanceCheckinRequest) (*types.AttendanceRecord, *types.AttendanceCheckin, error)
|
|
|
|
|
CreateAppeal(tenantID types.TenantID, uid types.Uid, appeal *types.AttendanceAppeal, idempotencyKey string) (*types.AttendanceAppeal, error)
|
|
|
|
|
ListAppeals(tenantID types.TenantID, uid types.Uid, opts types.AttendanceAppealListOptions) ([]types.AttendanceAppeal, string, error)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type attendanceMapper struct{}
|
|
|
|
|
|
|
|
|
|
var Attendance AttendancePersistenceInterface
|
|
|
|
|
|
|
|
|
|
func (attendanceMapper) Config(tenantID types.TenantID, uid types.Uid, date time.Time) (*types.AttendanceConfig, error) {
|
|
|
|
|
if uid.IsZero() || date.IsZero() {
|
|
|
|
|
return nil, types.ErrMalformed
|
|
|
|
|
}
|
|
|
|
|
tenantAdp, err := tenantBusinessAdapter(tenantID)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
return tenantAdp.TenantAttendanceConfig(tenantID, uid, date)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (attendanceMapper) ListRecords(tenantID types.TenantID, uid types.Uid, opts types.AttendanceRecordListOptions) ([]types.AttendanceRecord, string, *types.AttendanceRecordStats, error) {
|
|
|
|
|
if uid.IsZero() {
|
|
|
|
|
return nil, "", nil, types.ErrMalformed
|
|
|
|
|
}
|
|
|
|
|
if opts.Limit <= 0 || opts.Limit > 100 {
|
|
|
|
|
opts.Limit = 50
|
|
|
|
|
}
|
|
|
|
|
opts.Scope = strings.TrimSpace(opts.Scope)
|
|
|
|
|
if opts.Scope == "" {
|
|
|
|
|
opts.Scope = "mine"
|
|
|
|
|
}
|
|
|
|
|
if opts.Scope != "mine" && opts.Scope != "managed" {
|
|
|
|
|
return nil, "", nil, types.ErrMalformed
|
|
|
|
|
}
|
|
|
|
|
tenantAdp, err := tenantBusinessAdapter(tenantID)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, "", nil, err
|
|
|
|
|
}
|
|
|
|
|
return tenantAdp.TenantAttendanceRecordList(tenantID, uid, opts)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (attendanceMapper) Checkin(tenantID types.TenantID, uid types.Uid, checkinID string, req types.AttendanceCheckinRequest) (*types.AttendanceRecord, *types.AttendanceCheckin, error) {
|
|
|
|
|
if uid.IsZero() || strings.TrimSpace(checkinID) == "" || req.Date.IsZero() || req.ClientTime.IsZero() || !validAttendanceAction(req.Action) {
|
|
|
|
|
return nil, nil, types.ErrMalformed
|
|
|
|
|
}
|
|
|
|
|
tenantAdp, err := tenantBusinessAdapter(tenantID)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, nil, err
|
|
|
|
|
}
|
|
|
|
|
return tenantAdp.TenantAttendanceCheckin(tenantID, uid, strings.TrimSpace(checkinID), req)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (attendanceMapper) CreateAppeal(tenantID types.TenantID, uid types.Uid, appeal *types.AttendanceAppeal, idempotencyKey string) (*types.AttendanceAppeal, error) {
|
|
|
|
|
if uid.IsZero() || appeal == nil || strings.TrimSpace(appeal.AppealID) == "" || strings.TrimSpace(appeal.RecordID) == "" || strings.TrimSpace(appeal.Reason) == "" {
|
|
|
|
|
return nil, types.ErrMalformed
|
|
|
|
|
}
|
|
|
|
|
tenantAdp, err := tenantBusinessAdapter(tenantID)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
return tenantAdp.TenantAttendanceAppealCreate(tenantID, uid, appeal, strings.TrimSpace(idempotencyKey))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (attendanceMapper) ListAppeals(tenantID types.TenantID, uid types.Uid, opts types.AttendanceAppealListOptions) ([]types.AttendanceAppeal, string, error) {
|
|
|
|
|
if uid.IsZero() {
|
|
|
|
|
return nil, "", types.ErrMalformed
|
|
|
|
|
}
|
|
|
|
|
if opts.Limit <= 0 || opts.Limit > 100 {
|
|
|
|
|
opts.Limit = 50
|
|
|
|
|
}
|
|
|
|
|
opts.Scope = strings.TrimSpace(opts.Scope)
|
|
|
|
|
if opts.Scope == "" {
|
|
|
|
|
opts.Scope = "mine"
|
|
|
|
|
}
|
|
|
|
|
if opts.Scope != "mine" && opts.Scope != "managed" {
|
|
|
|
|
return nil, "", types.ErrMalformed
|
|
|
|
|
}
|
|
|
|
|
tenantAdp, err := tenantBusinessAdapter(tenantID)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, "", err
|
|
|
|
|
}
|
|
|
|
|
return tenantAdp.TenantAttendanceAppealList(tenantID, uid, opts)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func validAttendanceAction(action string) bool {
|
|
|
|
|
switch strings.TrimSpace(action) {
|
|
|
|
|
case types.AttendanceActionCheckIn, types.AttendanceActionCheckOut:
|
|
|
|
|
return true
|
|
|
|
|
default:
|
|
|
|
|
return false
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type MeetingsPersistenceInterface interface {
|
|
|
|
|
Create(tenantID types.TenantID, uid types.Uid, meeting *types.Meeting, attendeeIDs []types.Uid) (*types.Meeting, error)
|
|
|
|
|
List(tenantID types.TenantID, uid types.Uid, cursor string, limit int) ([]types.Meeting, string, error)
|
|
|
|
|
Get(tenantID types.TenantID, uid types.Uid, meetingID string) (*types.Meeting, error)
|
|
|
|
|
Update(tenantID types.TenantID, uid types.Uid, meetingID string, patch types.MeetingPatch, idempotencyKey string) (*types.Meeting, error)
|
|
|
|
|
Cancel(tenantID types.TenantID, uid types.Uid, meetingID, idempotencyKey string) (*types.Meeting, error)
|
|
|
|
|
Remind(tenantID types.TenantID, uid types.Uid, meetingID, idempotencyKey string) ([]types.MeetingParticipant, error)
|
|
|
|
|
Respond(tenantID types.TenantID, uid types.Uid, meetingID, response string, version int) (*types.Meeting, error)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type MeetingNotesPersistenceInterface interface {
|
|
|
|
|
List(tenantID types.TenantID, uid types.Uid, query, cursor string, limit int) ([]types.Meeting, string, error)
|
|
|
|
|
ListFiles(tenantID types.TenantID, uid types.Uid, meetingID string) ([]types.MeetingNoteFile, error)
|
|
|
|
|
CreateFile(tenantID types.TenantID, uid types.Uid, meetingID, noteFileID, fileID, idempotencyKey string) (*types.MeetingNoteFile, error)
|
|
|
|
|
ReplaceFile(tenantID types.TenantID, uid types.Uid, meetingID, noteFileID, fileID, idempotencyKey string, version int) (*types.MeetingNoteFile, error)
|
|
|
|
|
DeleteFile(tenantID types.TenantID, uid types.Uid, meetingID, noteFileID, idempotencyKey string, version int) (*types.MeetingNoteFile, error)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type meetingsMapper struct{}
|
|
|
|
|
type meetingNotesMapper struct{}
|
|
|
|
|
|
|
|
|
|
var Meetings MeetingsPersistenceInterface
|
|
|
|
|
var MeetingNotes MeetingNotesPersistenceInterface
|
|
|
|
|
|
|
|
|
|
func (meetingsMapper) Create(tenantID types.TenantID, uid types.Uid, meeting *types.Meeting, attendeeIDs []types.Uid) (*types.Meeting, error) {
|
|
|
|
|
if uid.IsZero() || meeting == nil || !validMeetingForCreate(meeting) {
|
|
|
|
|
return nil, types.ErrMalformed
|
|
|
|
|
}
|
|
|
|
|
tenantAdp, err := tenantBusinessAdapter(tenantID)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
return tenantAdp.TenantMeetingCreate(tenantID, uid, meeting, attendeeIDs)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (meetingsMapper) List(tenantID types.TenantID, uid types.Uid, cursor string, limit int) ([]types.Meeting, string, error) {
|
|
|
|
|
if uid.IsZero() {
|
|
|
|
|
return nil, "", types.ErrMalformed
|
|
|
|
|
}
|
|
|
|
|
if limit <= 0 || limit > 100 {
|
|
|
|
|
limit = 20
|
|
|
|
|
}
|
|
|
|
|
tenantAdp, err := tenantBusinessAdapter(tenantID)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, "", err
|
|
|
|
|
}
|
|
|
|
|
return tenantAdp.TenantMeetingList(tenantID, uid, strings.TrimSpace(cursor), limit)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (meetingsMapper) Get(tenantID types.TenantID, uid types.Uid, meetingID string) (*types.Meeting, error) {
|
|
|
|
|
if uid.IsZero() || strings.TrimSpace(meetingID) == "" {
|
|
|
|
|
return nil, types.ErrMalformed
|
|
|
|
|
}
|
|
|
|
|
tenantAdp, err := tenantBusinessAdapter(tenantID)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
return tenantAdp.TenantMeetingGet(tenantID, uid, strings.TrimSpace(meetingID))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (meetingsMapper) Update(tenantID types.TenantID, uid types.Uid, meetingID string, patch types.MeetingPatch, idempotencyKey string) (*types.Meeting, error) {
|
|
|
|
|
if uid.IsZero() || strings.TrimSpace(meetingID) == "" || patch.Version <= 0 || !validMeetingPatch(patch) {
|
|
|
|
|
return nil, types.ErrMalformed
|
|
|
|
|
}
|
|
|
|
|
tenantAdp, err := tenantBusinessAdapter(tenantID)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
return tenantAdp.TenantMeetingUpdate(tenantID, uid, strings.TrimSpace(meetingID), patch, strings.TrimSpace(idempotencyKey))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (meetingsMapper) Cancel(tenantID types.TenantID, uid types.Uid, meetingID, idempotencyKey string) (*types.Meeting, error) {
|
|
|
|
|
if uid.IsZero() || strings.TrimSpace(meetingID) == "" {
|
|
|
|
|
return nil, types.ErrMalformed
|
|
|
|
|
}
|
|
|
|
|
tenantAdp, err := tenantBusinessAdapter(tenantID)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
return tenantAdp.TenantMeetingCancel(tenantID, uid, strings.TrimSpace(meetingID), strings.TrimSpace(idempotencyKey))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (meetingsMapper) Remind(tenantID types.TenantID, uid types.Uid, meetingID, idempotencyKey string) ([]types.MeetingParticipant, error) {
|
|
|
|
|
if uid.IsZero() || strings.TrimSpace(meetingID) == "" {
|
|
|
|
|
return nil, types.ErrMalformed
|
|
|
|
|
}
|
|
|
|
|
tenantAdp, err := tenantBusinessAdapter(tenantID)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
return tenantAdp.TenantMeetingRemind(tenantID, uid, strings.TrimSpace(meetingID), strings.TrimSpace(idempotencyKey))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (meetingsMapper) Respond(tenantID types.TenantID, uid types.Uid, meetingID, response string, version int) (*types.Meeting, error) {
|
|
|
|
|
if uid.IsZero() || strings.TrimSpace(meetingID) == "" || !validMeetingResponse(response) || version <= 0 {
|
|
|
|
|
return nil, types.ErrMalformed
|
|
|
|
|
}
|
|
|
|
|
tenantAdp, err := tenantBusinessAdapter(tenantID)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
return tenantAdp.TenantMeetingRespond(tenantID, uid, strings.TrimSpace(meetingID), strings.TrimSpace(response), version)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (meetingNotesMapper) List(tenantID types.TenantID, uid types.Uid, query, cursor string, limit int) ([]types.Meeting, string, error) {
|
|
|
|
|
if uid.IsZero() {
|
|
|
|
|
return nil, "", types.ErrMalformed
|
|
|
|
|
}
|
|
|
|
|
if limit <= 0 || limit > 100 {
|
|
|
|
|
limit = 20
|
|
|
|
|
}
|
|
|
|
|
tenantAdp, err := tenantBusinessAdapter(tenantID)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, "", err
|
|
|
|
|
}
|
|
|
|
|
return tenantAdp.TenantMeetingNoteList(tenantID, uid, strings.TrimSpace(query), strings.TrimSpace(cursor), limit)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (meetingNotesMapper) ListFiles(tenantID types.TenantID, uid types.Uid, meetingID string) ([]types.MeetingNoteFile, error) {
|
|
|
|
|
if uid.IsZero() || strings.TrimSpace(meetingID) == "" {
|
|
|
|
|
return nil, types.ErrMalformed
|
|
|
|
|
}
|
|
|
|
|
tenantAdp, err := tenantBusinessAdapter(tenantID)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
return tenantAdp.TenantMeetingNoteFiles(tenantID, uid, strings.TrimSpace(meetingID))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (meetingNotesMapper) CreateFile(tenantID types.TenantID, uid types.Uid, meetingID, noteFileID, fileID, idempotencyKey string) (*types.MeetingNoteFile, error) {
|
|
|
|
|
if uid.IsZero() || strings.TrimSpace(meetingID) == "" || strings.TrimSpace(noteFileID) == "" || strings.TrimSpace(fileID) == "" {
|
|
|
|
|
return nil, types.ErrMalformed
|
|
|
|
|
}
|
|
|
|
|
tenantAdp, err := tenantBusinessAdapter(tenantID)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
return tenantAdp.TenantMeetingNoteFileCreate(tenantID, uid, strings.TrimSpace(meetingID), strings.TrimSpace(noteFileID), strings.TrimSpace(fileID), strings.TrimSpace(idempotencyKey))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (meetingNotesMapper) ReplaceFile(tenantID types.TenantID, uid types.Uid, meetingID, noteFileID, fileID, idempotencyKey string, version int) (*types.MeetingNoteFile, error) {
|
|
|
|
|
if uid.IsZero() || strings.TrimSpace(meetingID) == "" || strings.TrimSpace(noteFileID) == "" || strings.TrimSpace(fileID) == "" || version <= 0 {
|
|
|
|
|
return nil, types.ErrMalformed
|
|
|
|
|
}
|
|
|
|
|
tenantAdp, err := tenantBusinessAdapter(tenantID)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
return tenantAdp.TenantMeetingNoteFileReplace(tenantID, uid, strings.TrimSpace(meetingID), strings.TrimSpace(noteFileID), strings.TrimSpace(fileID), strings.TrimSpace(idempotencyKey), version)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (meetingNotesMapper) DeleteFile(tenantID types.TenantID, uid types.Uid, meetingID, noteFileID, idempotencyKey string, version int) (*types.MeetingNoteFile, error) {
|
|
|
|
|
if uid.IsZero() || strings.TrimSpace(meetingID) == "" || strings.TrimSpace(noteFileID) == "" || version <= 0 {
|
|
|
|
|
return nil, types.ErrMalformed
|
|
|
|
|
}
|
|
|
|
|
tenantAdp, err := tenantBusinessAdapter(tenantID)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
return tenantAdp.TenantMeetingNoteFileDelete(tenantID, uid, strings.TrimSpace(meetingID), strings.TrimSpace(noteFileID), strings.TrimSpace(idempotencyKey), version)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func validMeetingForCreate(meeting *types.Meeting) bool {
|
|
|
|
|
return strings.TrimSpace(meeting.MeetingID) != "" &&
|
|
|
|
|
strings.TrimSpace(meeting.Title) != "" &&
|
|
|
|
|
!meeting.StartAt.IsZero() &&
|
|
|
|
|
!meeting.EndAt.IsZero() &&
|
|
|
|
|
meeting.EndAt.After(meeting.StartAt)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func validMeetingPatch(patch types.MeetingPatch) bool {
|
|
|
|
|
if patch.Title == nil && patch.RecorderID == nil && patch.StartAt == nil && patch.EndAt == nil && patch.Location == nil && patch.ReminderMinutes == nil {
|
|
|
|
|
return false
|
|
|
|
|
}
|
|
|
|
|
if patch.Title != nil && strings.TrimSpace(*patch.Title) == "" {
|
|
|
|
|
return false
|
|
|
|
|
}
|
|
|
|
|
if patch.StartAt != nil && patch.EndAt != nil && !patch.EndAt.After(*patch.StartAt) {
|
|
|
|
|
return false
|
|
|
|
|
}
|
|
|
|
|
return true
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func validMeetingResponse(response string) bool {
|
|
|
|
|
switch strings.TrimSpace(response) {
|
|
|
|
|
case types.MeetingResponseAccepted, types.MeetingResponseDeclined, types.MeetingResponseTentative:
|
|
|
|
|
return true
|
|
|
|
|
default:
|
|
|
|
|
return false
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type DailyReportsPersistenceInterface interface {
|
|
|
|
|
List(tenantID types.TenantID, uid types.Uid, scope, from, to, status, cursor string, limit int) ([]types.DailyReport, string, error)
|
|
|
|
|
CreateDraft(tenantID types.TenantID, uid types.Uid, reportID string, reportDate time.Time) (*types.DailyReport, error)
|
|
|
|
|
Get(tenantID types.TenantID, uid types.Uid, reportID string) (*types.DailyReport, error)
|
|
|
|
|
SaveDraft(tenantID types.TenantID, uid types.Uid, reportID, content string, attachments []string, version int) (*types.DailyReport, error)
|
|
|
|
|
Submit(tenantID types.TenantID, uid types.Uid, reportID string, version int) (*types.DailyReport, error)
|
|
|
|
|
Stats(tenantID types.TenantID, uid types.Uid, date time.Time, departmentID string) (*types.DailyReportStats, error)
|
|
|
|
|
Remind(tenantID types.TenantID, uid types.Uid, date time.Time, userIDs []types.Uid, idempotencyKey string) ([]types.Uid, error)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type dailyReportsMapper struct{}
|
|
|
|
|
|
|
|
|
|
var DailyReports DailyReportsPersistenceInterface
|
|
|
|
|
|
|
|
|
|
func (dailyReportsMapper) List(tenantID types.TenantID, uid types.Uid, scope, from, to, status, cursor string, limit int) ([]types.DailyReport, string, error) {
|
|
|
|
|
if uid.IsZero() {
|
|
|
|
|
return nil, "", types.ErrMalformed
|
|
|
|
|
}
|
|
|
|
|
if limit <= 0 || limit > 100 {
|
|
|
|
|
limit = 50
|
|
|
|
|
}
|
|
|
|
|
tenantAdp, err := tenantBusinessAdapter(tenantID)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, "", err
|
|
|
|
|
}
|
|
|
|
|
return tenantAdp.TenantDailyReportList(tenantID, uid, strings.TrimSpace(scope), strings.TrimSpace(from), strings.TrimSpace(to), strings.TrimSpace(status), strings.TrimSpace(cursor), limit)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (dailyReportsMapper) CreateDraft(tenantID types.TenantID, uid types.Uid, reportID string, reportDate time.Time) (*types.DailyReport, error) {
|
|
|
|
|
if uid.IsZero() || strings.TrimSpace(reportID) == "" || reportDate.IsZero() {
|
|
|
|
|
return nil, types.ErrMalformed
|
|
|
|
|
}
|
|
|
|
|
tenantAdp, err := tenantBusinessAdapter(tenantID)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
return tenantAdp.TenantDailyReportCreateDraft(tenantID, uid, strings.TrimSpace(reportID), reportDate)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (dailyReportsMapper) Get(tenantID types.TenantID, uid types.Uid, reportID string) (*types.DailyReport, error) {
|
|
|
|
|
if uid.IsZero() || strings.TrimSpace(reportID) == "" {
|
|
|
|
|
return nil, types.ErrMalformed
|
|
|
|
|
}
|
|
|
|
|
tenantAdp, err := tenantBusinessAdapter(tenantID)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
return tenantAdp.TenantDailyReportGet(tenantID, uid, strings.TrimSpace(reportID))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (dailyReportsMapper) SaveDraft(tenantID types.TenantID, uid types.Uid, reportID, content string, attachments []string, version int) (*types.DailyReport, error) {
|
|
|
|
|
if uid.IsZero() || strings.TrimSpace(reportID) == "" || version <= 0 {
|
|
|
|
|
return nil, types.ErrMalformed
|
|
|
|
|
}
|
|
|
|
|
tenantAdp, err := tenantBusinessAdapter(tenantID)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
return tenantAdp.TenantDailyReportSaveDraft(tenantID, uid, strings.TrimSpace(reportID), content, attachments, version)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (dailyReportsMapper) Submit(tenantID types.TenantID, uid types.Uid, reportID string, version int) (*types.DailyReport, error) {
|
|
|
|
|
if uid.IsZero() || strings.TrimSpace(reportID) == "" || version <= 0 {
|
|
|
|
|
return nil, types.ErrMalformed
|
|
|
|
|
}
|
|
|
|
|
tenantAdp, err := tenantBusinessAdapter(tenantID)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
return tenantAdp.TenantDailyReportSubmit(tenantID, uid, strings.TrimSpace(reportID), version)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (dailyReportsMapper) Stats(tenantID types.TenantID, uid types.Uid, date time.Time, departmentID string) (*types.DailyReportStats, error) {
|
|
|
|
|
if uid.IsZero() || date.IsZero() {
|
|
|
|
|
return nil, types.ErrMalformed
|
|
|
|
|
}
|
|
|
|
|
tenantAdp, err := tenantBusinessAdapter(tenantID)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
return tenantAdp.TenantDailyReportStats(tenantID, uid, date, strings.TrimSpace(departmentID))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (dailyReportsMapper) Remind(tenantID types.TenantID, uid types.Uid, date time.Time, userIDs []types.Uid, idempotencyKey string) ([]types.Uid, error) {
|
|
|
|
|
if uid.IsZero() || date.IsZero() || strings.TrimSpace(idempotencyKey) == "" {
|
|
|
|
|
return nil, types.ErrMalformed
|
|
|
|
|
}
|
|
|
|
|
tenantAdp, err := tenantBusinessAdapter(tenantID)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
return tenantAdp.TenantDailyReportRemind(tenantID, uid, date, userIDs, strings.TrimSpace(idempotencyKey))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type MonthlyReportsPersistenceInterface interface {
|
|
|
|
|
List(tenantID types.TenantID, uid types.Uid, scope, fromMonth, toMonth, status, cursor string, limit int) ([]types.MonthlyReport, string, error)
|
|
|
|
|
CreateDraft(tenantID types.TenantID, uid types.Uid, reportID, month string) (*types.MonthlyReport, error)
|
|
|
|
|
Get(tenantID types.TenantID, uid types.Uid, reportID string) (*types.MonthlyReport, error)
|
|
|
|
|
SaveDraft(tenantID types.TenantID, uid types.Uid, reportID, workSummary, nextPlan string, attachments []string, version int) (*types.MonthlyReport, error)
|
|
|
|
|
Submit(tenantID types.TenantID, uid types.Uid, reportID string, version int) (*types.MonthlyReport, error)
|
|
|
|
|
Reopen(tenantID types.TenantID, uid types.Uid, reportID string, version int) (*types.MonthlyReport, error)
|
|
|
|
|
Stats(tenantID types.TenantID, uid types.Uid, month, departmentID string) (*types.MonthlyReportStats, error)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type monthlyReportsMapper struct{}
|
|
|
|
|
|
|
|
|
|
var MonthlyReports MonthlyReportsPersistenceInterface
|
|
|
|
|
|
|
|
|
|
func (monthlyReportsMapper) List(tenantID types.TenantID, uid types.Uid, scope, fromMonth, toMonth, status, cursor string, limit int) ([]types.MonthlyReport, string, error) {
|
|
|
|
|
if uid.IsZero() {
|
|
|
|
|
return nil, "", types.ErrMalformed
|
|
|
|
|
}
|
|
|
|
|
if limit <= 0 || limit > 100 {
|
|
|
|
|
limit = 50
|
|
|
|
|
}
|
|
|
|
|
tenantAdp, err := tenantBusinessAdapter(tenantID)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, "", err
|
|
|
|
|
}
|
|
|
|
|
return tenantAdp.TenantMonthlyReportList(tenantID, uid, strings.TrimSpace(scope), strings.TrimSpace(fromMonth), strings.TrimSpace(toMonth), strings.TrimSpace(status), strings.TrimSpace(cursor), limit)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (monthlyReportsMapper) CreateDraft(tenantID types.TenantID, uid types.Uid, reportID, month string) (*types.MonthlyReport, error) {
|
|
|
|
|
if uid.IsZero() || strings.TrimSpace(reportID) == "" || strings.TrimSpace(month) == "" {
|
|
|
|
|
return nil, types.ErrMalformed
|
|
|
|
|
}
|
|
|
|
|
tenantAdp, err := tenantBusinessAdapter(tenantID)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
return tenantAdp.TenantMonthlyReportCreateDraft(tenantID, uid, strings.TrimSpace(reportID), strings.TrimSpace(month))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (monthlyReportsMapper) Get(tenantID types.TenantID, uid types.Uid, reportID string) (*types.MonthlyReport, error) {
|
|
|
|
|
if uid.IsZero() || strings.TrimSpace(reportID) == "" {
|
|
|
|
|
return nil, types.ErrMalformed
|
|
|
|
|
}
|
|
|
|
|
tenantAdp, err := tenantBusinessAdapter(tenantID)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
return tenantAdp.TenantMonthlyReportGet(tenantID, uid, strings.TrimSpace(reportID))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (monthlyReportsMapper) SaveDraft(tenantID types.TenantID, uid types.Uid, reportID, workSummary, nextPlan string, attachments []string, version int) (*types.MonthlyReport, error) {
|
|
|
|
|
if uid.IsZero() || strings.TrimSpace(reportID) == "" || version <= 0 {
|
|
|
|
|
return nil, types.ErrMalformed
|
|
|
|
|
}
|
|
|
|
|
tenantAdp, err := tenantBusinessAdapter(tenantID)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
return tenantAdp.TenantMonthlyReportSaveDraft(tenantID, uid, strings.TrimSpace(reportID), workSummary, nextPlan, attachments, version)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (monthlyReportsMapper) Submit(tenantID types.TenantID, uid types.Uid, reportID string, version int) (*types.MonthlyReport, error) {
|
|
|
|
|
if uid.IsZero() || strings.TrimSpace(reportID) == "" || version <= 0 {
|
|
|
|
|
return nil, types.ErrMalformed
|
|
|
|
|
}
|
|
|
|
|
tenantAdp, err := tenantBusinessAdapter(tenantID)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
return tenantAdp.TenantMonthlyReportSubmit(tenantID, uid, strings.TrimSpace(reportID), version)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (monthlyReportsMapper) Reopen(tenantID types.TenantID, uid types.Uid, reportID string, version int) (*types.MonthlyReport, error) {
|
|
|
|
|
if uid.IsZero() || strings.TrimSpace(reportID) == "" || version <= 0 {
|
|
|
|
|
return nil, types.ErrMalformed
|
|
|
|
|
}
|
|
|
|
|
tenantAdp, err := tenantBusinessAdapter(tenantID)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
return tenantAdp.TenantMonthlyReportReopen(tenantID, uid, strings.TrimSpace(reportID), version)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (monthlyReportsMapper) Stats(tenantID types.TenantID, uid types.Uid, month, departmentID string) (*types.MonthlyReportStats, error) {
|
|
|
|
|
if uid.IsZero() || strings.TrimSpace(month) == "" {
|
|
|
|
|
return nil, types.ErrMalformed
|
|
|
|
|
}
|
|
|
|
|
tenantAdp, err := tenantBusinessAdapter(tenantID)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
return tenantAdp.TenantMonthlyReportStats(tenantID, uid, strings.TrimSpace(month), strings.TrimSpace(departmentID))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type MailboxPersistenceInterface interface {
|
|
|
|
|
Config(tenantID types.TenantID, uid types.Uid) (*types.MailboxConfig, error)
|
|
|
|
|
Submit(tenantID types.TenantID, uid types.Uid, submission *types.MailboxSubmission, idempotencyKey string) (*types.MailboxSubmission, error)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type mailboxMapper struct{}
|
|
|
|
|
|
|
|
|
|
var Mailbox MailboxPersistenceInterface
|
|
|
|
|
|
|
|
|
|
func (mailboxMapper) Config(tenantID types.TenantID, uid types.Uid) (*types.MailboxConfig, error) {
|
|
|
|
|
if uid.IsZero() {
|
|
|
|
|
return nil, types.ErrMalformed
|
|
|
|
|
}
|
|
|
|
|
tenantAdp, err := tenantBusinessAdapter(tenantID)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
return tenantAdp.TenantMailboxConfigGet(tenantID, uid)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (mailboxMapper) Submit(tenantID types.TenantID, uid types.Uid, submission *types.MailboxSubmission, idempotencyKey string) (*types.MailboxSubmission, error) {
|
|
|
|
|
if uid.IsZero() || submission == nil || strings.TrimSpace(submission.SubmissionID) == "" ||
|
|
|
|
|
strings.TrimSpace(submission.Subject) == "" || strings.TrimSpace(submission.Content) == "" ||
|
|
|
|
|
strings.TrimSpace(idempotencyKey) == "" {
|
|
|
|
|
return nil, types.ErrMalformed
|
|
|
|
|
}
|
|
|
|
|
tenantAdp, err := tenantBusinessAdapter(tenantID)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
return tenantAdp.TenantMailboxSubmissionCreate(tenantID, uid, submission, strings.TrimSpace(idempotencyKey))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type ProfilePersistenceInterface interface {
|
|
|
|
|
Get(tenantID types.TenantID, uid types.Uid) (*types.UserProfile, error)
|
|
|
|
|
Update(tenantID types.TenantID, uid types.Uid, patch types.UserProfilePatch) (*types.UserProfile, error)
|
|
|
|
@@ -5175,14 +4580,6 @@ func init() {
|
|
|
|
|
Conversations = conversationsMapper{}
|
|
|
|
|
Calls = callsMapper{}
|
|
|
|
|
GroupBusiness = groupBusinessMapper{}
|
|
|
|
|
Workbench = workbenchMapper{}
|
|
|
|
|
Organization = organizationMapper{}
|
|
|
|
|
Attendance = attendanceMapper{}
|
|
|
|
|
Meetings = meetingsMapper{}
|
|
|
|
|
MeetingNotes = meetingNotesMapper{}
|
|
|
|
|
DailyReports = dailyReportsMapper{}
|
|
|
|
|
MonthlyReports = monthlyReportsMapper{}
|
|
|
|
|
Mailbox = mailboxMapper{}
|
|
|
|
|
Profiles = profileMapper{}
|
|
|
|
|
AppReleases = appReleaseMapper{}
|
|
|
|
|
DevicePushTokens = devicePushTokenMapper{}
|
|
|
|
|