Skip to content

[FR] Improve Ability to detect if App has been Initialized #701

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
rickbau5 opened this issue May 8, 2023 · 2 comments
Open

[FR] Improve Ability to detect if App has been Initialized #701

rickbau5 opened this issue May 8, 2023 · 2 comments

Comments

@rickbau5
Copy link

rickbau5 commented May 8, 2023

Is your feature request related to a problem? Please describe.

Currently there is not a way offered by the library to check if firebase_admin.initialize_app(...)(source) has been called and an app has been initialized besides catching an exception. This can result in library users seeing the following exception:

ValueError: The default Firebase app already exists. This means you called initialize_app() more than once without providing an app name as the second argument. In most cases you only need to call initialize_app() once. But if you do want to initialize multiple apps, pass a second argument to initialize_app() to give each app a unique name.
source

From the discussion in this Stackoverflow post, there are two main approaches library users have implemented:

1. use a try/except block on ValueError to get the app and initialize it if there is an exception

try:
    app = firebase_admin.get_app()
except ValueError as e:
    cred = credentials.Certificate(CREDENTIALS_FIREBASE_PATH)
    firebase_admin.initialize_app(cred)

source

Pros: simple

Cons: ValueError is a general error so theoretically the use does not know for sure the error is regarding initialization, so further inspection is needed to verify that the error is related to app initialization, e.g. a string check on "already exists".

2. check the "private" _apps variable

if not firebase_admin._apps:
    cred = credentials.Certificate('path/to/serviceAccountKey.json') 
    default_app = firebase_admin.initialize_app(cred)

source

Pros: not relying on try/except flow

Cons: accessing a "private" variable, as the library owners now if you change this variable it will cause breaking changes for many library users.

Describe the solution you'd like

Option 1: Implement a function like is_initialized(name=_DEFAULT_APP_NAME)

This could check _apps for the given name and return true / false for whether it is initialized.

Option 2: Raise a specific error

Implement a new error that extends ValueError for backwards compatibility and raise the error with this new type.

For example:

class AppInitializedError(ValueError):
    def __init__(self, message):            
        super().__init__(message)

This could then be used:

try:
    app = firebase_admin.get_app()
except AppInitializedError:
    cred = credentials.Certificate(CREDENTIALS_FIREBASE_PATH)
    firebase_admin.initialize_app(cred)

These implementations could be done in conjunction, however option 1 is safest as it only adds new behavior and changes no existing behavior. Furthermore there will still be those against using try / except as the "expected" way to check if the app is initialized as offered in option 2.

Describe alternatives you've considered

The alternatives are described in the stackoverflow post above (link) as well as in this issue.

@google-oss-bot
Copy link

I couldn't figure out how to label this issue, so I've labeled it for a human to triage. Hang tight.

victorperezpiqueras pushed a commit to victorperezpiqueras/firebase-admin-python that referenced this issue Mar 27, 2024
victorperezpiqueras pushed a commit to victorperezpiqueras/firebase-admin-python that referenced this issue Mar 27, 2024
victorperezpiqueras added a commit to victorperezpiqueras/firebase-admin-python that referenced this issue Mar 27, 2024
@st3fus
Copy link

st3fus commented Apr 9, 2024

Yo we need this implemented. Having massive issues in production, most of notifications are not working due to this shitty handling of initialization

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

4 participants