mirror of
https://github.com/Foundry376/Mailspring.git
synced 2024-09-22 00:06:06 +08:00
rm(metadata): MetadataStore is not in use, should be rebuilt
Resolves a request that happens whenver the user starts the app, reported in #108
This commit is contained in:
parent
edaa07dfee
commit
6f587d6d98
|
@ -1,4 +0,0 @@
|
||||||
MetadataStore = require '../../src/flux/stores/metadata-store'
|
|
||||||
describe "MetadataStore", ->
|
|
||||||
beforeEach: ->
|
|
||||||
spyOn(atom, "isMainWindow").andReturn(true)
|
|
|
@ -1,114 +0,0 @@
|
||||||
_ = require 'underscore'
|
|
||||||
|
|
||||||
Reflux = require 'reflux'
|
|
||||||
Actions = require '../actions'
|
|
||||||
Metadata = require '../models/metadata'
|
|
||||||
|
|
||||||
EdgehillAPI = require '../edgehill-api'
|
|
||||||
|
|
||||||
DatabaseStore = require '../stores/database-store'
|
|
||||||
AccountStore = require '../stores/account-store'
|
|
||||||
|
|
||||||
|
|
||||||
CreateMetadataTask = require '../tasks/create-metadata-task'
|
|
||||||
DestroyMetadataTask = require '../tasks/destroy-metadata-task'
|
|
||||||
|
|
||||||
# TODO: This Store has to double cache data from the API and the DB with
|
|
||||||
# minor variation. There's a task to refactor these stores into something
|
|
||||||
# like an `APIBackedStore` to abstract some of the complex logic out.
|
|
||||||
|
|
||||||
MAX_API_RATE = 1000
|
|
||||||
|
|
||||||
module.exports =
|
|
||||||
MetadataStore = Reflux.createStore
|
|
||||||
init: ->
|
|
||||||
@listenTo DatabaseStore, @_onDBChanged
|
|
||||||
@listenTo AccountStore, @_onAccountChanged
|
|
||||||
|
|
||||||
refreshDBFromAPI = _.debounce(_.bind(@_refreshDBFromAPI, @), MAX_API_RATE)
|
|
||||||
@_typesToRefresh = {}
|
|
||||||
|
|
||||||
@listenTo Actions.metadataError, (errorData) =>
|
|
||||||
return unless errorData.type
|
|
||||||
@_typesToRefresh[errorData.type] = true
|
|
||||||
refreshDBFromAPI()
|
|
||||||
@listenTo Actions.metadataCreated, (type) =>
|
|
||||||
@_typesToRefresh[type] = true
|
|
||||||
refreshDBFromAPI()
|
|
||||||
@listenTo Actions.metadataDestroyed, (type) =>
|
|
||||||
@_typesToRefresh[type] = true
|
|
||||||
refreshDBFromAPI()
|
|
||||||
|
|
||||||
@_accountId = AccountStore.current()?.id
|
|
||||||
@_metadata = {}
|
|
||||||
|
|
||||||
@_fullRefreshFromAPI()
|
|
||||||
|
|
||||||
@_refreshCacheFromDB = _.debounce(_.bind(@_refreshCacheFromDB, @), 16)
|
|
||||||
@_refreshCacheFromDB()
|
|
||||||
|
|
||||||
# Returns a promise that will eventually return the metadata you want
|
|
||||||
getMetadata: (type, publicId, key) ->
|
|
||||||
if type? and publicId? and key?
|
|
||||||
return @_metadata[type]?[publicId]?[key]
|
|
||||||
else if type? and publicId?
|
|
||||||
return @_metadata[type]?[publicId]
|
|
||||||
else if type?
|
|
||||||
return @_metadata[type]
|
|
||||||
else return null
|
|
||||||
|
|
||||||
_fullRefreshFromAPI: ->
|
|
||||||
return if not atom.isMainWindow() or atom.inSpecMode()
|
|
||||||
return unless @_accountId
|
|
||||||
@_apiRequest() # The lack of type will request everything!
|
|
||||||
|
|
||||||
_refreshDBFromAPI: ->
|
|
||||||
return if not atom.isMainWindow() or atom.inSpecMode()
|
|
||||||
types = Object.keys(@_typesToRefresh)
|
|
||||||
@_typesToRefresh = {}
|
|
||||||
promises = types.map (type) => @_apiRequest(type)
|
|
||||||
Promise.settle(promises)
|
|
||||||
|
|
||||||
_apiRequest: (type) ->
|
|
||||||
typePath = if type then "/#{type}/" else "/"
|
|
||||||
new Promise (resolve, reject) =>
|
|
||||||
EdgehillAPI.request
|
|
||||||
path: "/metadata/#{@_accountId}#{typePath}"
|
|
||||||
success: (metadata) ->
|
|
||||||
metadata = metadata?.results ? []
|
|
||||||
metadata = metadata.map (metadatum) ->
|
|
||||||
metadatum.publicId = metadatum.id
|
|
||||||
return new Metadata(metadatum)
|
|
||||||
if metadata.length is 0 then resolve()
|
|
||||||
else
|
|
||||||
DatabaseStore.persistModels(metadata).then(resolve).catch(reject)
|
|
||||||
error: (apiError) ->
|
|
||||||
reject(apiError)
|
|
||||||
|
|
||||||
_onDBChanged: (change) ->
|
|
||||||
return unless change.objectClass is Metadata.name
|
|
||||||
@_refreshCacheFromDB()
|
|
||||||
|
|
||||||
_refreshCacheFromDB: ->
|
|
||||||
new Promise (resolve, reject) =>
|
|
||||||
DatabaseStore.findAll(Metadata)
|
|
||||||
.then (metadata=[]) =>
|
|
||||||
@_metadata = {}
|
|
||||||
for metadatum in metadata
|
|
||||||
@_metadata[metadatum.type] ?= {}
|
|
||||||
@_metadata[metadatum.type][metadatum.publicId] ?= {}
|
|
||||||
@_metadata[metadatum.type][metadatum.publicId][metadatum.key] = metadatum.value
|
|
||||||
@trigger()
|
|
||||||
resolve()
|
|
||||||
.catch (err) ->
|
|
||||||
console.warn("Request for Metadata failed. #{err}")
|
|
||||||
|
|
||||||
_onAccountChanged: ->
|
|
||||||
@_accountId = AccountStore.current()?.id
|
|
||||||
@_fullRefreshFromAPI()
|
|
||||||
|
|
||||||
_deleteAllMetadata: ->
|
|
||||||
DatabaseStore.findAll(Metadata).then (metadata) ->
|
|
||||||
meatdata.forEach (metadatum) ->
|
|
||||||
t = new DestroyMetadataTask(metadatum)
|
|
||||||
Actions.queueTask(t)
|
|
|
@ -103,7 +103,6 @@ class NylasExports
|
||||||
@require "MessageStore", 'flux/stores/message-store'
|
@require "MessageStore", 'flux/stores/message-store'
|
||||||
@require "ContactStore", 'flux/stores/contact-store'
|
@require "ContactStore", 'flux/stores/contact-store'
|
||||||
@require "CategoryStore", 'flux/stores/category-store'
|
@require "CategoryStore", 'flux/stores/category-store'
|
||||||
@require "MetadataStore", 'flux/stores/metadata-store'
|
|
||||||
@require "AnalyticsStore", 'flux/stores/analytics-store'
|
@require "AnalyticsStore", 'flux/stores/analytics-store'
|
||||||
@require "WorkspaceStore", 'flux/stores/workspace-store'
|
@require "WorkspaceStore", 'flux/stores/workspace-store'
|
||||||
@require "DraftCountStore", 'flux/stores/draft-count-store'
|
@require "DraftCountStore", 'flux/stores/draft-count-store'
|
||||||
|
|
Loading…
Reference in a new issue