Skip to content

Commit 750b59c

Browse files
authored
Merge pull request #3139 from omnivore-app/change-folder-to-state-1
2 parents bab9ec1 + 4e60396 commit 750b59c

File tree

20 files changed

+273
-119
lines changed

20 files changed

+273
-119
lines changed

packages/api/src/generated/graphql.ts

+2
Original file line numberDiff line numberDiff line change
@@ -1867,6 +1867,7 @@ export type QueryTypeaheadSearchArgs = {
18671867
export type QueryUpdatesSinceArgs = {
18681868
after?: InputMaybe<Scalars['String']>;
18691869
first?: InputMaybe<Scalars['Int']>;
1870+
folder?: InputMaybe<Scalars['String']>;
18701871
since: Scalars['Date'];
18711872
sort?: InputMaybe<SortParams>;
18721873
};
@@ -2466,6 +2467,7 @@ export type SetIntegrationInput = {
24662467
importItemState?: InputMaybe<ImportItemState>;
24672468
name: Scalars['String'];
24682469
syncedAt?: InputMaybe<Scalars['Date']>;
2470+
taskName?: InputMaybe<Scalars['String']>;
24692471
token: Scalars['String'];
24702472
type?: InputMaybe<IntegrationType>;
24712473
};

packages/api/src/generated/schema.graphql

+2-1
Original file line numberDiff line numberDiff line change
@@ -1368,7 +1368,7 @@ type Query {
13681368
sendInstallInstructions: SendInstallInstructionsResult!
13691369
subscriptions(sort: SortParams, type: SubscriptionType): SubscriptionsResult!
13701370
typeaheadSearch(first: Int, query: String!): TypeaheadSearchResult!
1371-
updatesSince(after: String, first: Int, since: Date!, sort: SortParams): UpdatesSinceResult!
1371+
updatesSince(after: String, first: Int, folder: String, since: Date!, sort: SortParams): UpdatesSinceResult!
13721372
user(userId: ID, username: String): UserResult!
13731373
users: UsersResult!
13741374
validateUsername(username: String!): Boolean!
@@ -1909,6 +1909,7 @@ input SetIntegrationInput {
19091909
importItemState: ImportItemState
19101910
name: String!
19111911
syncedAt: Date
1912+
taskName: String
19121913
token: String!
19131914
type: IntegrationType
19141915
}

packages/api/src/repository/label.ts

+4-1
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,10 @@ const convertToLabel = (label: CreateLabelInput, userId: string) => {
3232
return {
3333
user: { id: userId },
3434
name: label.name,
35-
color: label.color || generateRandomColor(), // assign a random color if not provided
35+
color:
36+
label.color ||
37+
getInternalLabelWithColor(label.name)?.color ||
38+
generateRandomColor(), // assign a random color if not provided
3639
description: label.description,
3740
internal: isLabelInternal(label.name),
3841
}

packages/api/src/resolvers/article/index.ts

+12-8
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,9 @@
55
/* eslint-disable @typescript-eslint/no-floating-promises */
66
import { Readability } from '@omnivore/readability'
77
import graphqlFields from 'graphql-fields'
8+
import { IsNull } from 'typeorm'
89
import { QueryDeepPartialEntity } from 'typeorm/query-builder/QueryPartialEntity'
9-
import { LibraryItem } from '../../entity/library_item'
10+
import { LibraryItem, LibraryItemState } from '../../entity/library_item'
1011
import { env } from '../../env'
1112
import {
1213
ArticleError,
@@ -390,7 +391,10 @@ export const getArticleResolver = authorized<
390391
const libraryItem = await authTrx((tx) =>
391392
tx.withRepository(libraryItemRepository).findOne({
392393
select: selectColumns,
393-
where,
394+
where: {
395+
...where,
396+
deletedAt: IsNull(),
397+
},
394398
relations: {
395399
labels: true,
396400
highlights: {
@@ -406,7 +410,7 @@ export const getArticleResolver = authorized<
406410
})
407411
)
408412

409-
if (!libraryItem || libraryItem.folder === InFilter.TRASH) {
413+
if (!libraryItem) {
410414
return { errorCodes: [ArticleErrorCode.NotFound] }
411415
}
412416

@@ -528,8 +532,8 @@ export const setBookmarkArticleResolver = authorized<
528532
const deletedLibraryItem = await updateLibraryItem(
529533
articleID,
530534
{
531-
folder: InFilter.TRASH,
532-
savedAt: new Date(),
535+
state: LibraryItemState.Deleted,
536+
deletedAt: new Date(),
533537
},
534538
uid,
535539
pubsub
@@ -737,7 +741,7 @@ export const updatesSinceResolver = authorized<
737741
UpdatesSinceSuccess,
738742
UpdatesSinceError,
739743
QueryUpdatesSinceArgs
740-
>(async (_obj, { since, first, after, sort: sortParams }, { uid }) => {
744+
>(async (_obj, { since, first, after, sort: sortParams, folder }, { uid }) => {
741745
const sort = sortParamsToSort(sortParams)
742746

743747
const startCursor = after || ''
@@ -755,7 +759,7 @@ export const updatesSinceResolver = authorized<
755759
includeDeleted: true,
756760
dateFilters: [{ field: 'updatedAt', startDate }],
757761
sort,
758-
inFilter: InFilter.ALL,
762+
inFilter: (folder as InFilter) || InFilter.ALL,
759763
},
760764
uid
761765
)
@@ -867,7 +871,7 @@ export const setFavoriteArticleResolver = authorized<
867871
})
868872

869873
const getUpdateReason = (libraryItem: LibraryItem, since: Date) => {
870-
if (libraryItem.folder === InFilter.TRASH) {
874+
if (libraryItem.deletedAt) {
871875
return UpdateReason.Deleted
872876
}
873877
if (libraryItem.createdAt >= since) {

packages/api/src/resolvers/integrations/index.ts

-2
Original file line numberDiff line numberDiff line change
@@ -216,8 +216,6 @@ export const importFromIntegrationResolver = authorized<
216216
ImportFromIntegrationError,
217217
MutationImportFromIntegrationArgs
218218
>(async (_, { integrationId }, { claims: { uid }, log }) => {
219-
log.info('importFromIntegrationResolver')
220-
221219
try {
222220
const integration = await findIntegration({ id: integrationId }, uid)
223221

packages/api/src/resolvers/links/index.ts

+16-5
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { LibraryItemState } from '../../entity/library_item'
12
import { env } from '../../env'
23
import {
34
ArchiveLinkError,
@@ -8,7 +9,6 @@ import {
89
import { updateLibraryItem } from '../../services/library_item'
910
import { analytics } from '../../utils/analytics'
1011
import { authorized } from '../../utils/helpers'
11-
import { InFilter } from '../../utils/search'
1212

1313
// export const updateLinkShareInfoResolver = authorized<
1414
// UpdateLinkShareInfoSuccess,
@@ -54,9 +54,20 @@ export const setLinkArchivedResolver = authorized<
5454
ArchiveLinkError,
5555
MutationSetLinkArchivedArgs
5656
>(async (_obj, args, { uid }) => {
57+
let state = LibraryItemState.Archived
58+
let archivedAt: Date | null = new Date()
59+
let event = 'link_archived'
60+
61+
const isUnarchive = !args.input.archived
62+
if (isUnarchive) {
63+
state = LibraryItemState.Succeeded
64+
archivedAt = null
65+
event = 'link_unarchived'
66+
}
67+
5768
analytics.track({
5869
userId: uid,
59-
event: args.input.archived ? 'link_archived' : 'link_unarchived',
70+
event,
6071
properties: {
6172
env: env.server.apiEnv,
6273
},
@@ -66,8 +77,8 @@ export const setLinkArchivedResolver = authorized<
6677
await updateLibraryItem(
6778
args.input.linkId,
6879
{
69-
savedAt: new Date(),
70-
folder: args.input.archived ? InFilter.ARCHIVE : InFilter.INBOX,
80+
state,
81+
archivedAt,
7182
},
7283
uid
7384
)
@@ -80,6 +91,6 @@ export const setLinkArchivedResolver = authorized<
8091

8192
return {
8293
linkId: args.input.linkId,
83-
message: 'Link Archived',
94+
message: event,
8495
}
8596
})

packages/api/src/resolvers/update/index.ts

+4
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { LibraryItemState } from '../../entity/library_item'
12
import {
23
MutationUpdatePageArgs,
34
UpdatePageError,
@@ -20,6 +21,9 @@ export const updatePageResolver = authorized<
2021
savedAt: input.savedAt ? new Date(input.savedAt) : undefined,
2122
publishedAt: input.publishedAt ? new Date(input.publishedAt) : undefined,
2223
thumbnail: input.previewImage ?? undefined,
24+
state: input.state
25+
? (input.state as unknown as LibraryItemState)
26+
: undefined,
2327
},
2428
uid
2529
)

packages/api/src/routers/svc/following.ts

+32-3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
/* eslint-disable @typescript-eslint/no-misused-promises */
22
import express from 'express'
3+
import {
4+
findOrCreateLabels,
5+
saveLabelsInLibraryItem,
6+
} from '../../services/labels'
37
import { saveFeedItemInFollowing } from '../../services/library_item'
48
import { logger } from '../../utils/logger'
59

@@ -19,6 +23,7 @@ export interface SaveFollowingItemRequest {
1923
previewContentType?: string
2024
publishedAt?: Date
2125
savedAt?: Date
26+
thumbnail?: string
2227
}
2328

2429
function isSaveFollowingItemRequest(
@@ -49,16 +54,40 @@ export function followingServiceRouter() {
4954
return res.status(400).send('INVALID_REQUEST_BODY')
5055
}
5156

52-
if (req.body.addedToFollowingFrom === 'feed') {
53-
logger.info('saving feed item')
57+
if (
58+
req.body.addedToFollowingFrom === 'feed' &&
59+
req.body.userIds.length > 0
60+
) {
61+
const userId = req.body.userIds[0]
62+
logger.info('saving feed item', userId)
5463

55-
const result = await saveFeedItemInFollowing(req.body)
64+
const result = await saveFeedItemInFollowing(req.body, userId)
5665
if (result.identifiers.length === 0) {
5766
logger.error('error saving feed item in following')
5867
return res.status(500).send('ERROR_SAVING_FEED_ITEM')
5968
}
6069

6170
logger.info('feed item saved in following')
71+
72+
// add RSS label to the item
73+
const labels = await findOrCreateLabels(
74+
[
75+
{
76+
name: 'RSS',
77+
},
78+
],
79+
userId
80+
)
81+
await saveLabelsInLibraryItem(
82+
labels,
83+
result.identifiers[0].id,
84+
userId,
85+
undefined,
86+
true
87+
)
88+
89+
logger.info('RSS label added to the item')
90+
6291
return res.sendStatus(200)
6392
}
6493

packages/api/src/schema.ts

+2
Original file line numberDiff line numberDiff line change
@@ -1997,6 +1997,7 @@ const schema = gql`
19971997
enabled: Boolean!
19981998
syncedAt: Date
19991999
importItemState: ImportItemState
2000+
taskName: String
20002001
}
20012002
20022003
union IntegrationsResult = IntegrationsSuccess | IntegrationsError
@@ -2826,6 +2827,7 @@ const schema = gql`
28262827
first: Int
28272828
since: Date!
28282829
sort: SortParams
2830+
folder: String
28292831
): UpdatesSinceResult!
28302832
integrations: IntegrationsResult!
28312833
recentSearches: RecentSearchesResult!

packages/api/src/services/labels.ts

+12-2
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,8 @@ export const saveLabelsInLibraryItem = async (
6969
labels: Label[],
7070
libraryItemId: string,
7171
userId: string,
72-
pubsub = createPubSubClient()
72+
pubsub = createPubSubClient(),
73+
skipPubSub = false
7374
) => {
7475
await authTrx(
7576
async (tx) => {
@@ -92,6 +93,10 @@ export const saveLabelsInLibraryItem = async (
9293
userId
9394
)
9495

96+
if (skipPubSub) {
97+
return
98+
}
99+
95100
// create pubsub event
96101
await pubsub.entityCreated<AddLabelsToLibraryItemEvent>(
97102
EntityType.LABEL,
@@ -104,7 +109,8 @@ export const addLabelsToLibraryItem = async (
104109
labels: Label[],
105110
libraryItemId: string,
106111
userId: string,
107-
pubsub = createPubSubClient()
112+
pubsub = createPubSubClient(),
113+
skipPubSub = false
108114
) => {
109115
await authTrx(
110116
async (tx) => {
@@ -128,6 +134,10 @@ export const addLabelsToLibraryItem = async (
128134
userId
129135
)
130136

137+
if (skipPubSub) {
138+
return
139+
}
140+
131141
// create pubsub event
132142
await pubsub.entityCreated<AddLabelsToLibraryItemEvent>(
133143
EntityType.LABEL,

0 commit comments

Comments
 (0)